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编实现程动态图像的创建代码
Sep 28 PHP
PHP提取数据库内容中的图片地址并循环输出
Mar 21 PHP
让PHP更快的提供文件下载的代码
Jun 13 PHP
深入php之规范编程命名小结
May 15 PHP
php导入导出excel实例
Oct 25 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
PHP中调用C/C++制作的动态链接库的教程
Mar 10 PHP
php仿微信红包分配算法的实现方法
May 13 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 PHP
浅谈Yii乐观锁的使用及原理
Jul 25 PHP
php中通用的excel导出方法实例
Dec 30 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
PHP EOT定界符的使用详解
2008/09/30 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
php利用cookie实现自动登录的方法
2014/12/10 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
python爬虫基础之urllib的使用
2020/12/31 Python
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
东方电视购物:东方CJ
2016/10/12 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
银行青年文明号事迹材料
2014/05/31 职场文书
爱国主义教育演讲稿
2014/08/26 职场文书
房租涨价通知
2015/04/23 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android