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 相关文章推荐
开源SNS系统-ThinkSNS
May 18 PHP
取得单条网站评论以数组形式进行输出
Jul 28 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
Nov 19 PHP
PHP通过API获取手机号码归属地
May 28 PHP
PHP读MYSQL中文乱码的快速解决方法
Oct 01 PHP
PHP实现根据密码长度显示安全条
Jul 04 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
基于php编程规范(详解)
Aug 17 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
Oct 11 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
Apr 02 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
Jun 05 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
php打印输出棋盘的实现方法
2014/12/23 PHP
thinkphp中的url跳转用法分析
2016/07/12 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
java解析json方法总结
2019/05/16 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
javascript新手语法小结
2008/06/15 Javascript
jQuery validate 中文API 附validate.js中文api手册
2010/07/31 Javascript
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
2014/06/16 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
JavaScript实现拖拽效果
2020/03/16 Javascript
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
python super函数使用方法详解
2020/02/14 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
如何执行一个shell程序
2012/11/23 面试题
体育学院毕业生自荐信
2013/11/03 职场文书
伊索寓言教学反思
2014/05/01 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
总经理助理岗位职责
2015/01/31 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
民事答辩状格式范文
2015/05/21 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
Oracle数据库事务的开启与结束详解
2022/06/25 Oracle