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 相关文章推荐
使用无限生命期Session的方法
Oct 09 PHP
PHP开发框架总结收藏
Apr 24 PHP
php结合飞信 免费天气预报短信
May 07 PHP
显示程序执行时间php函数代码
Aug 29 PHP
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 PHP
php中3种方法删除字符串中间的空格
Mar 10 PHP
在Win7 中为php扩展配置Xcache
Oct 08 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
Nov 10 PHP
php实现mysql连接池效果实现代码
Jan 25 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
在PHP中输出JS语句以及乱码问题的解决方案
Feb 13 PHP
PHP正则表达式之RCEService回溯
Apr 11 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 获取页面中指定内容的实现类
2014/01/23 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
Egret引擎开发指南之运行项目
2014/09/03 Javascript
Javascript基础教程之函数对象和属性
2015/01/18 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
javascript实现弹幕墙效果
2019/11/28 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
python基础_文件操作实现全文或单行替换的方法
2017/09/04 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
python实现烟花小程序
2019/01/30 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
新闻学毕业生自荐信
2013/11/15 职场文书
电厂厂长岗位职责
2014/01/02 职场文书
农村面貌改造提升实施方案
2014/03/18 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
万能检讨书
2015/01/27 职场文书
长城的导游词
2015/01/30 职场文书
党员年度个人总结
2015/02/14 职场文书
单身申明具结书
2015/02/26 职场文书
商场广播稿范文
2015/08/19 职场文书
解除合同协议书范本
2016/03/21 职场文书