php常用算法汇总
- 格式:docx
- 大小:54.82 KB
- 文档页数:74
按数量级递增排列,常见的时间复杂度有:常数阶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常用算法总汇/*多选分类修改,数据入库增删留数组说明:$k 和$v 是一一对应*///旧分类$a1=array(’1′=>’杂文’,’2′=>’小说’,’3′=>’散文’);//新分类$a2=array(’3′=>’散文’,’4′=>’诗歌’,’6′=>’文学’);foreach($a1 as $k => $v) {$have=”;foreach($a2 as $ks => $vs) {echo “$v==$vs..”;if($v==$vs){$have=1;}if(!array_key_exists($ks,$a1)) {$add[$ks]=$vs;}}if($have){$bao[$k]=$v;}else{$del[$k]=$v;}}var_dump($add);//新增的记录var_dump($del);//删除的记录var_dump($bao);//保留的记录方式二:无key//旧分类$a1=array(‘杂文’,'小说’,'散文’); //新分类$a2=array(‘散文’,'诗歌’,'文学’); foreach($a1 as $k => $v) {$have=”;foreach($a2 as $ks => $vs) {echo “$v==$vs..”;if($v==$vs){$have=1;}if(!in_array($vs, $a1)){$add[$vs]=$vs;}}if($have){$bao[]=$v;}else{$del[]=$v;}}var_dump($add);//新增的记录var_dump($del);//删除的记录var_dump($bao);//保留的记录—————————- 比较全的随机数(字)class getRandstrClass{function getCode ($length = 32, $mode = 0) {switch ($mode) {case ’1′:$str = ’1234567890′;break;case ’2′:$str = ‘abcdefghijklmnopqrstuvwxyz’;break;case ’3′:$str = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’;break;c ase ’4′:$str =‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst uvwxyz’;break;case ’5′:$str = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890′; break;case ’6′:$str = ‘abcdefghijklmnopqrstuvwxyz1234567890′;break;default:$str =‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef ghijklmnopqrst uvwxyz1234567890′;break;}$randString = ”;$len = strlen($str)-1;for($i = 0;$i < $length;$i ++){$num = mt_rand(0, $len);$randString .= $str[$num];}return $randString ;}}$code = new getRandstrClass();$length = 16;$mode = 1;$str = $code->getCode($length, $mode);echo $str;$code = NULL;———————–有两个数值型变量$a ,$b ,请在不使用用第二个变量的情况下交换它们的值$a=3;$b=4;$a=$a+$b;$b=$a-$b;$a=$a-$b;//list($b, $a) = array($a, $b);————————–【选择排序(一维数组)】【基本思想】:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
【示例】:[初始关键字] [49 38 65 97 76 13 27 49]第一趟排序后13 [38 65 97 76 49 27 49]第二趟排序后13 27 [65 97 76 49 38 49]第三趟排序后13 27 38 [97 76 49 65 49]第四趟排序后13 27 38 49 [49 97 65 76]第五趟排序后13 27 38 49 49 [97 97 76] 第六趟排序后13 27 38 49 49 76 [76 97] 第七趟排序后13 27 38 49 49 76 76 [ 97] 最后排序结果13 27 38 49 49 76 76 97 */function select_sort($arr){$count = count($arr);for($i=0; $i<$count; $i++){$k = $i;for($j=$i+1; $j<$count; $j++){if ($arr[$k] > $arr[$j])$k = $j;}//最小元素k和i调换if($k != $i){$tmp = $arr[$i];$arr[$i] = $arr[$k];$arr[$k] = $tmp;}}return $arr;}————————–【插入排序(一维数组)】【基本思想】:每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。
【示例】:[初始关键字] [49] 38 65 97 76 13 27 49J=2(38) [38 49] 65 97 76 13 27 49J=3(65) [38 49 65] 97 76 13 27 49J=4(97) [38 49 65 97] 76 13 27 49J=5(76) [38 49 65 76 97] 13 27 49J=6(13) [13 38 49 65 76 97] 27 49J=7(27) [13 27 38 49 65 76 97] 49J=8(49) [13 27 38 49 49 65 76 97]*/function insert_sort($arr){$count = count($arr);for($i=1; $i<$count; $i++){$tmp = $arr[$i];$j = $i - 1;while($arr[$j] > $tmp){$arr[$j+1] = $arr[$j];$arr[$j] = $tmp;$j–;}}return $arr;}------------冒泡排序(一维数组)【基本思想】:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。