时间复杂度
常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3), k次方阶O(nk),指数阶O(2n),随着问题规模不断扩大,上述时间复杂度不断地增大,算法执行效率越来越低。
一、常数阶(O(1))
<?php //从上到下所有的代码执行一次 $a = 123; $b = 456; $c = $a + $b; echo $c;
二、对数阶(O(log2n))
<?php $num = 1; while($num < n){ $num = $num * 2; //在while循环里面是顺序的执行(时间复杂度为O(1)) }
三、线性阶(O(n))
<?php for($i = 0; $i < 9; $i++){ //顺序执行。时间复杂度为O(1) }
四、平方阶(O(n2))
<?php for($i = 0; $i < 9; $i++){ for($j = 0; $j < 9; $j++){ //时间复杂度O(1) } }
五、立方阶(O(n3))
<?php for($i = 0; $i < 9; $i++){ for($j = 0; $j < 9; $j++){ for($j = 0; $j < 9; $j++){ //时间复杂度O(1) } } }
空间复杂度
一、递归情况
function binSearch($arr, $key, $start, $end) { $mid = ceil(($start+$end) / 2); if($arr[$mid] < $key){ binSearch($arr, $key, $mid+1, $end); }else if($arr[$mid] > $key){ binSearch($arr, $key, $start, $mid-1); }else{ return $mid; } }
注意:
1、递归情况下的空间复杂度:如果每次递归的辅助空间为常数,则空间复杂度为O(N)。
2、递归的二分查找的空间复杂度:递归深度是log2^n,每次递归的辅助空间为常数,所以空间复杂度为O(log2n)。
二、迭代情况
function binSearch($arr, $key){ $start=0; $end=count($arr)-1; while($start <= $end){ $mid = ceil(($start+$end)/2); if($arr[$mid] < $key){ $start = $mid+1; }else if($arr[$mid] > $key){ $end = $mid-1; }else{ return $mid; } } }
在这个过程中,辅助空间为常数级别,所以空间复杂度为O(1)(有一个辅助变量$mid)
总结
时间复杂度:
1、用常数1来取代所有时间的所有加法常数,比如这个程序被执行了三次应该是O(3),3是常数直接用1取代为O(1);
2、在修改后的运行次数中,只保留最高阶项,比如O(n^2+3n+3),最后的时间复杂度是O(n^2),2是常数直接用1替代;
3、如果最高阶项不存在1的常数,则去除最高阶项的常数,比如O(2n^2+1),最后的时间复杂度是O(n^2)。
空间复杂度:
1、包括程序代码所占用的空间、输入数据所占用的空间、辅助变量所占用的空间。