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 相关文章推荐
第1次亲密接触PHP5(1)
Oct 09 PHP
PHP4实际应用经验篇(1)
Oct 09 PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
Mar 03 PHP
php 过滤器实现代码
Aug 09 PHP
php实现以只读方式打开文件的方法
Mar 16 PHP
php修改文件上传限制方法汇总
Apr 07 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
php删除数组指定元素实现代码
May 03 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP实现合并两个排序链表的方法
Jan 19 PHP
php实现 master-worker 守护多进程模式的实例代码
Jul 20 PHP
php常用的工具开发整理
Sep 26 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
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
2013/09/30 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
基本DOM节点操作
2017/01/17 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
在MAC上搭建python数据分析开发环境
2016/01/26 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
Django自定义认证方式用法示例
2017/06/23 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
pytorch 求网络模型参数实例
2019/12/30 Python
python语言中有算法吗
2020/06/16 Python
python super()函数的基本使用
2020/09/10 Python
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
教师简历自我评价
2014/02/03 职场文书
优秀毕业生事迹材料
2014/02/12 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
工作会议方案
2014/05/21 职场文书
工地宣传标语
2014/06/18 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
2016年党建工作简报
2015/11/26 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android