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 相关文章推荐
解决GD中文乱码问题
Feb 14 PHP
PHP 判断变量类型实现代码
Oct 23 PHP
一个PHP的String类代码
Apr 20 PHP
php写的带缓存数据功能的mysqli类
Sep 06 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
May 06 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
Mar 23 PHP
浅析Yii2 GridView实现下拉搜索教程
Apr 22 PHP
yii2使用gridView实现下拉列表筛选数据
Apr 10 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
分析php://output和php://stdout的区别
May 06 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
smarty获得当前url的方法分享
2014/02/14 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
浅谈PHP封装CURL
2019/03/06 PHP
js获取div高度的代码
2008/08/09 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
BootStrap智能表单demo示例详解
2016/06/13 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
2016/11/07 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
angularjs1.X 重构controller 的方法小结
2019/08/15 Javascript
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
python实现数独算法实例
2015/06/09 Python
Php多进程实现代码
2018/05/07 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
利用Python写一个爬妹子的爬虫
2018/06/08 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
python如何删除文件中重复的字段
2019/07/16 Python
浅谈Python描述数据结构之KMP篇
2020/09/06 Python
HTML5教程之html 5 本地数据库(Web Sql Database)
2014/04/03 HTML / CSS
Hotter Shoes美国官网:英国最受欢迎的舒适鞋
2018/08/02 全球购物
法学研究生自我鉴定范文
2013/12/04 职场文书
中专生自我鉴定范文
2013/12/19 职场文书
地球一小时倡议书
2014/04/15 职场文书
小学作文评语大全
2014/04/21 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
门面房租房协议书
2014/12/01 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
spring boot项目application.properties文件存放及使用介绍
2021/06/30 Java/Android