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原创论坛
Oct 09 PHP
PHP开发需要注意的安全问题
Sep 01 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
php中mkdir函数用法实例分析
Nov 15 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
Jan 26 PHP
php去除字符串中空字符的常用方法小结
Mar 17 PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
php对象工厂类完整示例
Aug 09 PHP
PHP实现简单日历类编写
Aug 28 PHP
Yii实现微信公众号场景二维码的方法实例
Aug 30 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列出MySQL中所有数据库的方法
2015/03/12 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
详解php命令注入攻击
2019/04/06 PHP
jQuery get和post 方法传值注意事项
2009/11/03 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
实例讲解JavaScript中instanceof运算符的用法
2016/06/08 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
2016/07/11 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
初步剖析C语言编程中的结构体
2016/01/16 Python
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
python列表返回重复数据的下标
2020/02/10 Python
Python xlwt模块使用代码实例
2020/06/10 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
白色公司:The White Company
2017/10/11 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
12.4法制宣传日活动总结
2014/08/26 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
《将心比心》教学反思
2016/02/23 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书