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 相关文章推荐
建立动态的WML站点(二)
Oct 09 PHP
加强版phplib的DB类
Mar 31 PHP
php自动给文章加关键词链接的函数代码
Nov 29 PHP
PHP设计模式之解释器模式的深入解析
Jun 13 PHP
Symfony页面的基本创建实例详解
Jan 26 PHP
最准确的php截取字符串长度函数
Oct 29 PHP
PHP中Http协议post请求参数
Nov 02 PHP
PHP Echo字符串的连接格式
Mar 07 PHP
Yii2使用swiftmailer发送邮件的方法
May 03 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
yii框架无限极分类的实现方法
Apr 08 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
Feb 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
php 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
PHP实现显示照片exif信息的方法
2014/07/11 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
vue-loader中引入模板预处理器的实现
2019/09/04 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
Python标准库笔记struct模块的使用
2018/02/22 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
python实现人机五子棋
2020/03/25 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
公司市场部岗位职责
2013/12/02 职场文书
宿舍卫生检讨书
2014/01/16 职场文书
抄作业检讨书
2014/02/17 职场文书
销售员试用期自我评价
2014/09/15 职场文书
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL
如何在Python中妥善使用进度条详解
2022/04/05 Python