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水印技术
Feb 14 PHP
Cannot modify header information错误解决方法
Oct 08 PHP
PHP中文分词的简单实现代码分享
Jul 17 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
Jul 31 PHP
PHP关联数组的10个操作技巧
Jan 21 PHP
深入PHP异步执行的详解
Jun 03 PHP
初识Laravel
Oct 30 PHP
php实现用已经过去多长时间的方式显示时间
Jun 05 PHP
SSO单点登录的PHP实现方法(Laravel框架)
Mar 23 PHP
PHP验证码类ValidateCode解析
Jan 07 PHP
PHP中快速生成随机密码的几种方式
Apr 17 PHP
ThinkPHP5框架缓存查询操作分析
May 30 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
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
分享3个php获取日历的函数
2015/09/25 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
js TextArea的选中区域处理
2010/12/28 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
JavaScript时间转换处理函数
2015/04/14 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
2020/05/16 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
仓库规划计划书
2014/04/28 职场文书
政工例会汇报材料
2014/08/26 职场文书
学生检讨书如何写
2014/10/30 职场文书
python基础详解之if循环语句
2021/04/24 Python
如何在CSS中绘制曲线图形及展示动画
2021/05/24 HTML / CSS