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日历程序
Dec 06 PHP
php面向对象全攻略 (四)构造方法与析构方法
Sep 30 PHP
PHP采集利器 Snoopy 试用心得
Jul 03 PHP
优化PHP代码技巧的小结
Jun 02 PHP
php图像处理函数大全(推荐收藏)
Jul 11 PHP
如何在php中正确的使用json
Aug 06 PHP
win7计划任务定时执行PHP脚本设置图解
May 09 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
centos 7.2下搭建LNMP环境教程
Nov 20 PHP
PHP基于回溯算法解决n皇后问题的方法示例
Nov 07 PHP
php实现QQ小程序发送模板消息功能
Sep 18 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
Aug 24 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实现获取文章内容第一张图片的方法
2014/11/04 PHP
js代码实现微博导航栏
2015/07/30 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
window.open打开页面居中显示的示例代码
2013/12/27 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
2019/06/10 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
Python中的MongoDB基本操作:连接、查询实例
2015/02/13 Python
python获取list下标及其值的简单方法
2016/09/12 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
详解Python3定时器任务代码
2019/09/23 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
Keras自定义IOU方式
2020/06/10 Python
python中_del_还原数据的方法
2020/12/09 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
应届生船舶驾驶求职信
2013/10/19 职场文书
年度考核自我鉴定
2014/02/02 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
演讲开场白台词大全
2015/05/29 职场文书
合作意向书怎么写
2019/06/24 职场文书