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 版本]
Mar 20 PHP
10条PHP编程习惯助你找工作
Sep 29 PHP
PHP设计模式之解释器模式的深入解析
Jun 13 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
php中unserialize返回false的解决方法
Sep 22 PHP
PHP函数实现分页含文本分页和数字分页
Oct 23 PHP
PHP中使用循环实现的金字塔图形
Nov 08 PHP
php强制用户转向www域名的方法
Jun 19 PHP
php字符集转换
Jan 23 PHP
PHP利用Socket获取网站的SSL证书与公钥
Jun 18 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
Aug 03 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
Jul 24 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
PHPMailer邮件发送的实现代码
2013/05/04 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
javascript 学习之旅 (3)
2009/02/05 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
jQuery判断checkbox选中状态
2016/05/12 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
Python网络编程 Python套接字编程
2017/09/13 Python
python基础练习之几个简单的游戏
2017/11/10 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
django如何通过类视图使用装饰器
2019/07/24 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
教师年终个人自我评价
2013/10/04 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
前处理组长岗位职责
2014/03/01 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
企业介绍信范文
2015/01/30 职场文书
2016中学教师读书心得体会
2016/01/13 职场文书
PHP策略模式写法
2021/04/01 PHP
Mysql数据库group by原理详解
2022/07/07 MySQL