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 session应用实例 登录验证
Mar 16 PHP
PHP 变量的定义方法
Jan 26 PHP
php eval函数用法总结
Oct 31 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
May 07 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
PHP使用PDO操作数据库的乱码问题解决方法
Apr 08 PHP
浅谈PHP的反射机制
Dec 15 PHP
php实现生成code128条形码的方法详解
Jul 19 PHP
CI框架(CodeIgniter)操作redis的方法详解
Jan 25 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
在laravel5.2中实现点击用户头像更改头像的方法
Oct 14 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正则preg_replace_callback函数用法实例
2015/06/01 PHP
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
浅谈node的事件机制
2017/10/09 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
浅谈PDF.js使用心得
2018/06/07 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
Vue实现简单计算器
2021/01/20 Vue.js
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
Python随机读取文件实现实例
2017/05/25 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
2018/05/24 Python
Python continue继续循环用法总结
2018/06/10 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
Python Django基础二之URL路由系统
2019/07/18 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
国旗下演讲稿
2014/05/08 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
平安建设汇报材料
2014/12/29 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
加薪申请报告范本
2015/05/15 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis