php经典算法集锦


Posted in PHP onNovember 14, 2015

本文实例讲述了php几个经典算法。分享给大家供大家参考,具体如下:

有5个人偷了一堆苹果,准备在第二天分赃。晚上,有一人遛出来,把所有菜果分成5份,但是多了一个,顺手把这个扔给树上的猴了,自己先拿1/5藏了。没想到其他四人也都是这么想的,都如第一个人一样分成5份把多的那一个扔给了猴,偷走了1/5。第二天,大家分赃,也是分成5份多一个扔给猴了。最后一人分了一份。问:共有多少苹果?

for ($i = 1; ; $i++)
{
  if ($i%5 == 1) {
    //第一个人取五分之一,还剩$t
    $t = $i - round($i/5) - 1;
    if($t % 5 == 1)
    {
      //第二个人取五分之一,还剩$r
      $r = $t - round($t/5) - 1;
      if($r % 5 == 1)
      {
        //第三个人取五分之一,还剩$s
        $s = $r - round($r/5) - 1;
        if($s % 5 == 1)
        {
          //第四个人取五分之一,还剩$x
          $x = $s - round($s/5) - 1;
          if($x % 5 == 1)
          {
            //第五个人取五分之一,还剩$y
            $y = $x - round($x/5) - 1;
            if ($y % 5 == 1) {
              echo $i;
              break;
            }
          }
        }
      }
    }
  }
}

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

function king($n, $m){
  $monkeys = range(1, $n);
  $i=0;
  $k=$n;
  while (count($monkeys)>1) {
    if(($i+1)%$m==0) {
      unset($monkeys[$i]);
    } else {
      array_push($monkeys,$monkeys[$i]);
      unset($monkeys[$i]);
    }
    $i++;
  }
  return current($monkeys);
}
$a = king(5, 2);
var_dump($a);

汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。

后来,这个传说就演变为汉诺塔游戏:

1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上

经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C

此外,汉诺塔问题也是程序设计中的经典递归问题。

function hanoi($n,$x,$y,$z){
  if($n==1){
    echo 'move disk 1 from '.$x.' to '.$z."\n";
  }else{
    hanoi($n-1,$x,$z,$y);
    echo 'move disk '.$n.' from '.$x.' to '.$z."\n";
    hanoi($n-1,$y,$x,$z);
  }   
}
hanoi(3,'A','B','C');

使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组

//对数组冒泡排序
function bubble_sort($array){
  $count = count($array);
  if ($count <= 0) 
    return false;
    for($i=0; $i<$count; $i++){
      for($j=$count-1; $j>$i; $j?){
      if ($array[$j] < $array[$j-1]){
        $tmp = $array[$j];
        $array[$j] = $array[$j-1];
        $array[$j-1] = $tmp;
    }
  }
}
return $array;
}
function quick_sort($array) {
  if (count($array) <= 1) return $array;
  $key = $array[0];
  $left_arr = array();
  $right_arr = array();
  for ($i=1; $i<count($array); $i++){
  if ($array[$i] <= $key)
    $left_arr[] = $array[$i];
  else
    $right_arr[] = $array[$i];
  }
  $left_arr = quick_sort($left_arr);
  $right_arr = quick_sort($right_arr);
  return array_merge($left_arr, array($key), $right_arr);
}

使用PHP描述顺序查找和二分查找算法,顺序查找必须考虑效率,对象可以是一个有序数组

//使用二分查找数组中某个元素
function bin_sch($array, $low, $high, $k){
  if ($low <= $high){
    $mid = intval(($low+$high)/2);
    if ($array[$mid] == $k){
      return $mid;
    }elseif ($k < $array[$mid]){
    return bin_sch($array, $low, $mid-1, $k);
  }else{
    return bin_sch($array, $mid+1, $high, $k);
  }
  }
  return -1;
}

写一个二维数组排序算法函数,可以调用php内置函数,能够具有通用性

function array_sort($arr, $keys, $order=0) {
  if (!is_array($arr)) {
    return false;
  }
  $keysvalue = array();
  foreach($arr as $key => $val) {
    $keysvalue[$key] = $val[$keys];
  }
  if($order == 0){
    asort($keysvalue);
  }else {
    arsort($keysvalue);
  }
  reset($keysvalue);
  foreach($keysvalue as $key => $vals) {
    $keysort[$key] = $key;
  }
  $new_array = array();
  foreach($keysort as $key => $val) {
    $new_array[$key] = $arr[$val];
  }
  return $new_array;
}

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

PHP 相关文章推荐
整合了前面的PHP数据库连接类~~做成一个分页类!
Nov 25 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
Could not load type System.ServiceModel.Activation.HttpModule解决办法
Dec 29 PHP
php继承中方法重载(覆盖)的应用场合
Feb 09 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
php对文件进行hash运算的方法
Apr 03 PHP
php设置页面超时时间解决方法
Sep 22 PHP
PHP实现的策略模式简单示例
Aug 25 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
Aug 21 PHP
mongodb和php的用法详解
Mar 25 PHP
PHP使用ActiveMQ实现消息队列的方法详解
May 31 PHP
PHP copy函数使用案例代码解析
Sep 01 PHP
PHP常用的小程序代码段
Nov 14 #PHP
PHP使用PHPexcel导入导出数据的方法
Nov 14 #PHP
PHP实现的一致性哈希算法完整实例
Nov 14 #PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 #PHP
PHP+redis实现添加处理投票的方法
Nov 14 #PHP
PHP实现操作redis的封装类完整实例
Nov 14 #PHP
php实现的递归提成方案实例
Nov 14 #PHP
You might like
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
全面解析PHP面向对象的三大特征
2017/06/10 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
php生成微信红包数组的方法
2019/09/05 PHP
php给数组赋值的实例方法
2019/09/26 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
2011/07/15 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
javascript折半查找详解
2015/01/26 Javascript
jQuery通过Ajax返回JSON数据
2015/04/28 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
Node.JS如何实现JWT原理
2020/09/18 Javascript
python 域名分析工具实现代码
2009/07/15 Python
使用Python获取Linux系统的各种信息
2014/07/10 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
Python rstrip()方法实例详解
2018/11/11 Python
python制作抖音代码舞
2019/04/07 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
JBL英国官网:JBL UK
2018/07/04 全球购物
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
采购求职信
2014/03/17 职场文书
责任书格式
2015/01/29 职场文书
现场施工员岗位职责
2015/04/11 职场文书
八月一日观后感
2015/06/10 职场文书
导游词之塘栖古镇
2019/12/04 职场文书