时间复杂度和空间复杂度

时间复杂度

常见的时间复杂度有:常数阶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、包括程序代码所占用的空间、输入数据所占用的空间、辅助变量所占用的空间。

原文地址:https://www.cnblogs.com/meichao/p/9227654.html