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读取IMAP邮件
Oct 09 PHP
请php正则走开
Mar 15 PHP
利用php+mysql来做一个功能强大的在线计算器
Oct 12 PHP
windows环境下php配置memcache的具体操作步骤
Jun 09 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
PHP与javascript实现变量交互的示例代码
Jul 23 PHP
PHP利用REFERER根居访问来地址进行页面跳转
Sep 28 PHP
php的闭包(Closure)匿名函数详解
Feb 22 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
php实现倒计时效果
Dec 19 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
PHP7 其他语言层面的修改
Mar 09 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中并发读写文件冲突的解决方案
2013/10/25 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
判断是否安装flash player及当前版本的JS代码
2013/08/08 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
jquery与ajax获取特殊字符实例详解
2017/01/08 Javascript
js实现简单的二级联动效果
2017/03/09 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
vue 导出文件,携带请求头token操作
2020/09/10 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
Python 条件判断的缩写方法
2008/09/06 Python
使用python实现strcmp函数功能示例
2014/03/25 Python
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
降低python版本的操作方法
2020/09/11 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
如何在存储过程中使用Loop
2016/01/05 面试题
如何唤起类中的一个方法
2013/11/29 面试题
高中生校园生活自我评价
2013/09/19 职场文书
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
品质管理部岗位职责范文
2014/03/01 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis