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+xslt在windows平台上
Oct 09 PHP
用PHP实现多服务器共享SESSION数据的方法
Mar 16 PHP
PHP中基本符号及使用方法
Mar 23 PHP
WordPress判断用户是否登录的代码
Mar 17 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
phpcms模块开发之swfupload的使用介绍
Apr 28 PHP
解析php file_exists无效的解决办法
Jun 26 PHP
调整PHP的性能
Oct 30 PHP
php define的第二个参数使用方法
Nov 04 PHP
php抓取并保存网站图片的实现代码
Oct 28 PHP
PHP常见错误提示含义解释(实用!值得收藏)
Apr 25 PHP
PHP操作路由器实现方法示例
Apr 27 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获取网卡地址的代码
2008/04/09 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
2016/02/18 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
python绘制高斯曲线
2021/02/19 Python
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
经济信息管理专业大学生求职信
2013/09/27 职场文书
企业标语大全
2014/07/01 职场文书
临时租车协议范本
2014/09/23 职场文书
第一军规观后感
2015/06/12 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python