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语法(1)
Oct 09 PHP
模仿OSO的论坛(四)
Oct 09 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
php实现的Captcha验证码类实例
Sep 22 PHP
php实现的双向队列类实例
Sep 24 PHP
PHP中使用CURL获取页面title例子
Jan 07 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
Jan 22 PHP
一个PHP实现的轻量级简单爬虫
Jul 08 PHP
PHP微信开发之文本自动回复
Jun 23 PHP
php中final关键字用法分析
Dec 07 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
php libevent 功能与使用方法详解
Mar 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
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
pandas factorize实现将字符串特征转化为数字特征
2019/12/19 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
Python3监控疫情的完整代码
2020/02/20 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
有机童装:Toby Tiger
2018/05/23 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
政法学院毕业生求职信
2014/02/28 职场文书
党性分析自查总结
2014/10/14 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python
AngularJS实现多级下拉框
2022/03/25 Javascript