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 09 PHP
php读取30天之内的根据算法排序的代码
Apr 06 PHP
新安装的MySQL数据库需要注意的安全知识
Jul 30 PHP
PHP系列学习之日期函数使用介绍
Aug 18 PHP
php实现自动获取生成文章主题关键词功能的深入分析
Jun 03 PHP
php基于表单密码验证与HTTP验证用法实例
Jan 06 PHP
Yii学习总结之数据访问对象 (DAO)
Feb 22 PHP
php字符串分割函数用法实例
Mar 17 PHP
php实现倒计时效果
Dec 19 PHP
symfony2.4的twig中date用法分析
Mar 18 PHP
php中static和const关键字用法分析
Dec 07 PHP
php使用curl伪造来源ip和refer的方法示例
May 08 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数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
如何使用php实现评委评分器
2015/07/31 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
简单JS代码压缩器
2006/10/12 Javascript
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
python 中if else 语句的作用及示例代码
2018/03/05 Python
Python3的介绍、安装和命令行的认识(推荐)
2018/10/20 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
python根据时间获取周数代码实例
2019/09/30 Python
如何基于python生成list的所有的子集
2019/11/11 Python
python二元表达式用法
2019/12/04 Python
python实现梯度法 python最速下降法
2020/03/24 Python
python能开发游戏吗
2020/06/11 Python
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
离婚协议书应该怎么写
2014/10/12 职场文书
2014年药房工作总结
2014/11/22 职场文书
车队安全员岗位职责
2015/02/15 职场文书
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS