程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php 常用算法和時間復雜度

php 常用算法和時間復雜度

編輯:關於PHP編程
    本篇文章是對php中的常用算法以及時間復雜度進行了詳細的分析介紹,需要的朋友參考下  

    按數量級遞增排列,常見的時間復雜度有:常數階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);

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved