PHP实现的贪婪算法实例


Posted in PHP onOctober 17, 2017

本文实例讲述了PHP实现的贪婪算法。分享给大家供大家参考,具体如下:

背景介绍:贪婪算法与数据结构知识库算法可以说是离我们生活最近的一种算法,人总是贪婪的嘛,所以这种算法的设计是很符合人性的。之所以这么说,是因为人们会在生活中有意无意的使用贪婪算法来解决问题。最常见的就是找零钱了,每个人都没学过该怎么找零钱,但在所有面额的钱都充足时,每个人都会找出同样组合来凑够需要的钱。其实这里面就是贪婪算法在起作用。

设计思路:贪婪法的设计思路可以从两方面来理解,即直观上和数学上。从直观上理解贪婪算法就是用最快的方法来解决问题。在这里面“快”是主要目标,例如上面找零钱的例子,假如你要找的零钱为6.6元。那首先要拿一张5元的,因为这可以使你凑的钱增长最快。如果人民币有6元的面额那你肯定会选6元的而不是拿两张别的来凑6元;从数学上来理解贪婪算法就是在做判断时以当前最优解为目标,类似于最优化中的最速下降法。这种方法的好处是解题速度极快,基本上是一次历遍就可以完成。

算法缺陷:正如做人不能太贪婪一样,贪婪算法本身有着致命的缺陷,这使得其应用背景收到了很多限制。因为算法是取的局部最优解,没有考虑以后的问题。这就像一个自私自利的人一样,虽然短时间内可以获得一些利益,但长期以往,很难会有大的成就。当然,社会很复杂,也许会有人一直自私下去而生活的还不错。这体现在算法上就是在一些情况下(具体下面会提到),贪婪算法是可以得到最优解的,这对于算法设计来说当然是好事。

/*
* 贪婪算法
* $arr   array  处理数组
* $volume  int   盒子容量
*/
function greedy($arr, $volume){
    $box = array();
    $boxNum = 0;
    $num = count( $arr );
    for ($i = 0; $i < $num; $i++) {
      $boxCode = true;
      for ($j = 0; $j < $boxNum; $j++) {
        if ($arr[$i] + $box[$j]['v'] <= $volume) {
          $box[$j]['v'] += $arr[$i];
          $box[$j]['k'][] = $i;
          $boxCode = false;
          break;
        }
      }
      if ($boxCode) {
        $box[$boxNum]['v'] = $arr[$i];
        $box[$boxNum]['k'][] = $i;
        $boxNum++;
      }
    }
    return $box;
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP.MVC的模板标签系统(三)
Sep 05 PHP
PHP合并数组+与array_merge的区别分析
Aug 01 PHP
从康盛产品(discuz)提取出来的模板类
Jun 28 PHP
php实现图片缩放功能类
Dec 18 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
Jan 14 PHP
php生成百度sitemap站点地图类函数实例
Oct 17 PHP
Symfony2 session用法实例分析
Feb 04 PHP
Zend Framework缓存Cache用法简单实例
Mar 19 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
PHP常量及变量区别原理详解
Aug 14 PHP
PHPstorm启用自动换行的方法详解(IDE)
Sep 17 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
Oct 17 #PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 #PHP
基于PHP-FPM进程池探秘
Oct 17 #PHP
PHP-X系列教程之内置函数的使用示例
Oct 16 #PHP
php封装单文件上传到数据库(路径)
Oct 15 #PHP
PHP多进程编程之僵尸进程问题的理解
Oct 15 #PHP
PHP多进程之pcntl_fork的实例详解
Oct 15 #PHP
You might like
生成静态页面的PHP类
2006/07/15 PHP
php 抽象类的简单应用
2011/09/06 PHP
php中的登陆login实例代码
2016/06/20 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
JavaScript数组的5种迭代方法
2017/09/29 Javascript
Vue.directive()的用法和实例详解
2018/03/04 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
python双向链表实现实例代码
2013/11/21 Python
python实现计算资源图标crc值的方法
2014/10/05 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
Python中三维坐标空间绘制的实现
2020/09/22 Python
python实现三种随机请求头方式
2021/01/05 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
心得体会范文
2014/01/04 职场文书
小学岗位竞聘方案
2014/01/22 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
欢迎领导检查标语
2014/06/27 职场文书
三严三实对照检查材料
2014/08/25 职场文书
对照四风自我剖析材料
2014/10/07 职场文书
监考失职检讨书
2015/01/26 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python