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自动选择 连接本地还是远程数据库
Dec 02 PHP
数据库中排序的对比及使用条件详解
Feb 23 PHP
php在服务器执行exec命令失败的解决方法
Mar 03 PHP
带密匙的php加密解密示例分享
Jan 29 PHP
php实现从上传文件创建缩略图的方法
Apr 02 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
Dec 25 PHP
Symfony2学习笔记之插件格式分析
Mar 17 PHP
PHP生成唯一ID之SnowFlake算法
Dec 17 PHP
一键生成各种尺寸Icon的php脚本(实例)
Feb 08 PHP
使用laravel的migrate创建数据表的方法
Sep 30 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 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之第五天
2006/10/09 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
js实现div色块碰撞
2020/01/16 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
Django之模型层多表操作的实现
2019/01/08 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
python django下载大的csv文件实现方法分析
2019/07/19 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
生产厂长岗位职责
2014/02/21 职场文书
电气工程自动化求职信
2014/03/14 职场文书
校外活动方案
2014/08/28 职场文书
公证书格式
2015/01/23 职场文书
公司财务人员岗位职责
2015/04/14 职场文书