php 常用算法和时间复杂度


Posted in PHP onJuly 01, 2013

按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3)

//二分查找O(log2n)
function erfen($a,$l,$h,$f){
    if($l >$h){ return false;}
    $m = intval(($l+$h)/2);
    if ($a[$m] == $f){
        return $m;
    }elseif ($f < $a[$m]){
        return erfen($a, $l, $m-1, $f);
    }else{
        return erfen($a, $m+1, $h, $f);
    }}
$a = array(1,12,23,67,88,100);
var_dump(erfen($a,0,5,1));
//遍历树O(log2n)
function bianli($p){
    $a = array();
    foreach (glob($p.'/*') as $f){
        if(is_dir($f)){
            $a = array_merge($a,bianli($f));
        }else{
            $a[] = $f;
        }
    }
    return $a;
}
//阶乘O(log2n)
function jc($n){
    if($n<=1){
        return 1;
    }else{
        return $n*jc($n-1);
    }    
}
//快速查找  O(n *log2(n))
function kuaisu($a){
    $c = count($a);
    if($c <= 1){return $a;}
    $l = $r = array();    
    for ($i=1;$i<$c;$i++){
        if($a[$i] < $a[0]){
            $l[] = $a[$i];
        }else{
            $r[] = $a[$i];
        }
    }
    $l = kuaisu($l);
    $r = kuaisu($r);
    return array_merge($l,array($a[0]),$r);
}
//插入排序  O(N*N)
function charu($a){
  $c = count($a);
  for($i=1;$i<$c;$i++){
      $t = $a[$i];
      for($j=$i;$j>0 && $a[$j-1]>$t;$j--){
          $a[$j] = $a[$j-1];          
      }
      $a[$j] = $t;
  }
  return $a;
}
//选择排序O(N*N)
function xuanze($a){
    $c = count($a);
    for($i=0;$i<$c;$i++){
        for ($j=$i+1;$j<$c;$j++){
            if($a[$i]>$a[$j]){
                $t = $a[$j];
                $a[$j] = $a[$i];
                $a[$i] = $t;
             }
        }
    }
    return $a;
}
//冒泡排序   O(N*N)
function maopao($a){
    $c = count($a);
    for($i=0;$i<$c;$i++){
        for ($j=$c-1;$j>$i;$j--){
            if($a[$j] < $a[$j-1]){
               $t = $a[$j-1];
               $a[$j-1] = $a[$j];
               $a[$j] = $t;
            }
        }    
    }
    return $a;
}

/**
 * 排列组合
 * 采用二进制方法进行组合的选择,如表示5选3时,只需有3位为1就可以了,所以可得到的组合是 01101 11100 00111 10011 01110等10种组合
 *
 * @param 需要排列的数组 $arr
 * @param 最小个数 $min_size
 * @return 满足条件的新数组组合
 */
function plzh($arr,$size=5) {
  $len = count($arr);
  $max = pow(2,$len);
  $min = pow(2,$size)-1;
  $r_arr = array();
  for ($i=$min; $i<$max; $i++){
   $count = 0;
   $t_arr = array();
   for ($j=0; $j<$len; $j++){
    $a = pow(2, $j);
    $t = $i&$a;
    if($t == $a){
     $t_arr[] = $arr[$j];
     $count++;
    }
   }   
   if($count == $size){
    $r_arr[] = $t_arr;    
   }   
  }
  return $r_arr;
 }$pl = pl(array(1,2,3,4,5,6,7),5);
var_dump($pl);

PHP 相关文章推荐
说明的比较细的php 正则学习实例
Jul 30 PHP
一个很不错的PHP翻页类
Jun 01 PHP
php中Smarty模板初体验
Aug 08 PHP
php的array_multisort()使用方法介绍
May 16 PHP
php生成excel文件的简单方法
Feb 08 PHP
PHP调用wsdl文件类型的接口代码分享
Nov 19 PHP
php自定义加密与解密程序实例
Dec 31 PHP
php中的常用魔术方法汇总
Feb 14 PHP
微信支付开发发货通知实例
Jul 12 PHP
php结合ajax实现手机发红包的案例
Oct 13 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
Oct 17 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
关于php循环跳出的问题
Jul 01 #PHP
深入解析PHP中的(伪)多线程与多进程
Jul 01 #PHP
IIS安装Apache伪静态插件的具体操作图文
Jul 01 #PHP
解析csv数据导入mysql的方法
Jul 01 #PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
Jul 01 #PHP
浅析php插件 HTMLPurifier HTML解析器
Jul 01 #PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
Jul 01 #PHP
You might like
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
jQuery实现可以扩展的日历
2020/12/01 jQuery
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
Python3并发写文件与Python对比
2019/11/20 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
python如何绘制疫情图
2020/09/16 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
优秀求职信范文分享
2013/12/19 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
感谢信范文大全
2015/01/23 职场文书
新郎接新娘保证书
2015/05/08 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书