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 11 PHP
PHP MemCached 高级缓存应用代码
Aug 05 PHP
微博短链接算法php版本实现代码
Sep 15 PHP
php将session放入memcached的设置方法
Feb 14 PHP
PHP_Cooikes不同页面无法传递的解决方法
Mar 07 PHP
php中session过期时间设置及session回收机制介绍
May 05 PHP
php使用sql server验证连接数据库的方法
Dec 25 PHP
Yii中Model(模型)的创建及使用方法
Dec 28 PHP
详解Yii2 定制表单输入字段的标签和样式
Jan 04 PHP
PHP封装返回Ajax字符串和JSON数组的方法
Feb 17 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
Jun 12 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 中执行系统外部命令
2006/10/09 PHP
文件上传程序的全部源码
2006/10/09 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
2020/10/29 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
Python深入06——python的内存管理详解
2016/12/07 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
python中format()函数的简单使用教程
2018/03/14 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
解析Python的缩进规则的使用
2019/01/16 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
WiFi云数码相框:Nixplay
2018/07/05 全球购物
工商管理专业学生的自我评价
2013/10/01 职场文书
计算机专业推荐信范文
2013/11/27 职场文书
学前教育学生自荐信范文
2013/12/31 职场文书
春节晚会开场白
2015/05/29 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python