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 相关文章推荐
第四节 构造函数和析构函数 [4]
Oct 09 PHP
php不用正则采集速度探究总结
Mar 24 PHP
php preg_match_all结合str_replace替换内容中所有img
Oct 11 PHP
PHP防CC攻击实现代码
Dec 29 PHP
php处理斐波那契数列非递归方法
Feb 04 PHP
php中url传递中文字符,特殊危险字符的解决方法
Aug 17 PHP
memcache命令启动参数中文解释
Jan 13 PHP
两种php实现图片上传的方法
Jan 22 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
Oct 10 PHP
php7 错误处理机制修改实例分析
May 25 PHP
PHP重载基础知识回顾
Sep 10 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
yii上传文件或图片实例
2014/04/01 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
javascript实现的listview效果
2007/04/28 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
2019/04/10 Javascript
Vue中props的详解
2019/05/16 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
python生成指定尺寸缩略图的示例
2014/05/07 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
python求解数组中两个字符串的最小距离
2018/09/27 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
暇步士官网:Hush Puppies
2016/09/22 全球购物
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
大众服装店创业计划书范文
2014/01/01 职场文书
医院义诊活动总结
2014/07/04 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python