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生成html分页列表的代码
Mar 18 PHP
常用的php ADODB使用方法集锦
Mar 25 PHP
一个php导出oracle库的php代码
Apr 20 PHP
php 全局变量范围分析
Aug 07 PHP
php列出一个目录下的所有文件的代码
Oct 09 PHP
关于尾递归的使用详解
May 02 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 PHP
教你如何解密 “ PHP 神盾解密工具 ”
Jun 20 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
Apr 14 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
PHP定时执行任务的3种方法详解
Dec 21 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
Jul 18 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之require/include顺序 推荐
2011/01/02 PHP
PHP中require和include路径问题详解
2014/12/25 PHP
PHP Primary script unknown 解决方法总结
2019/08/22 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
js选项卡的制作方法
2017/01/23 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
详解VueJS应用中管理用户权限
2018/02/02 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
angular 内存溢出的问题解决
2018/07/12 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
利用python批量修改word文件名的方法示例
2017/10/17 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
基于Python pyecharts实现多种图例代码解析
2020/08/10 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
太行山上观后感
2015/06/05 职场文书
django 认证类配置实现
2021/11/11 Python
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers
Java实现字符串转为驼峰格式的方法详解
2022/07/07 Java/Android