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文件注释标记及规范小结
Apr 01 PHP
解析PHP中一些可能会被忽略的问题
Jun 21 PHP
PHP反射使用实例和PHP反射API的中文说明
Jul 02 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
Jan 07 PHP
33道php常见面试题及答案
Jul 06 PHP
PHP实现简单数字分页效果
Jul 26 PHP
PHP+JS三级菜单联动菜单实现方法
Feb 24 PHP
php简单统计在线人数的方法
May 10 PHP
Smarty环境配置与使用入门教程
May 11 PHP
基于PHP-FPM进程池探秘
Oct 17 PHP
PHP实现负载均衡session共享redis缓存操作示例
Aug 22 PHP
php日志函数error_log用法实例分析
Sep 23 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
laravel 多图上传及图片的存储例子
2019/10/14 PHP
js计数器代码
2006/11/04 Javascript
永不消失的title提示代码
2007/02/15 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
详解JS面向对象编程
2016/01/24 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
Python实现从百度API获取天气的方法
2015/03/11 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
python邮件发送smtplib使用详解
2020/06/16 Python
Python docx库用法示例分析
2019/02/16 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
某公司C#程序员面试题笔试题
2014/05/26 面试题
买房委托公证书
2014/04/08 职场文书
学期评语大全
2014/04/30 职场文书
普通党员对照检查材料
2014/08/28 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
明星邀请函
2015/02/02 职场文书
监理中标通知书
2015/04/16 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
Z-Order加速Hudi大规模数据集方案分析
2022/03/31 Servers