PHP实现的贪婪算法实例

yipeiwu_com6年前PHP代码库

本文实例讲述了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基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》及《php程序设计算法总结

希望本文所述对大家PHP程序设计有所帮助。

相关文章

php将金额数字转化为中文大写

php将金额数字转化为中文大写 echo toChineseNumber(1234567890);//壹拾贰亿叁仟肆佰伍拾陆万柒仟捌佰玖拾圆 function toChineseNu...

PHP中非常有用却鲜有人知的函数集锦

本文实例总结了PHP中非常有用却鲜有人知的函数。分享给大家供大家参考,具体如下: PHP里有非常丰富的内置函数,很多我们都用过,但仍有很多的函数我们大部分人都不熟悉,可它们却十分的有用。...

Thinkphp中import的几个用法详细介绍

下面附上import的几个用法介绍 1、用法一 import('@.Test.Translate'); @,表示项目根目录。假定根目录是:App/ 导入类库的路径是:App/Lib/Te...

PHP进阶学习之命名空间基本用法分析

PHP进阶学习之命名空间基本用法分析

本文实例讲述了PHP进阶学习之命名空间基本用法。分享给大家供大家参考,具体如下: 前言 命名空间(namespace),在编程语言中,是对作用域的一种特殊的抽象.它表示着一个标识符的可见...

php转换颜色为其反色的方法

本文实例讲述了php转换颜色为其反色的方法。分享给大家供大家参考。具体分析如下: 这段php代码可以把一个颜色变成与之相反的颜色编码,如:白色变成黑色,蓝色变成黄色 function...