算法分析课,我感觉我分析不明白时间复杂度。所以就记录一下子怎么进行空间复杂度。在这之前需要了解时间复杂度如何计算,以及知道 O ( n ) Ω ( n ) Θ ( n ) 0 O(n) \quad \Omega(n) \quad \Theta(n)0 O(n)Ω(n)Θ(n)0
计算原则:
- 有数组就看数组长度
- 有递归就看递归深度(栈的容量)
- 二者都有取最大值
一般情况下,一个程序在机器上执行时,除了需要寄存本身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的辅助存储空间。其中,对于输入数据所占的具体存储量取决于问题本身,与算法无关,这样只需分析该算法在实现时所需要的辅助空间就可以了。若算法执行时所需要的辅助空间相对于输入数据量而言是个常数,则称这个算法为原地工作,辅助空间为O(1)。
那看一下快排的空间复杂度:
假设从小到大排,选第一个为轴值:
1 2 3 4 5 6 7 ... n
选轴值怎么选:
1 2 3…
这样递归的深度就是n,空间复杂度
O
(
n
)
O(n)
O(n)
n n-1 ... 6 5 4 3 2 1
这样轴值是:
n n-1 n-2 …
递归深度依旧是n,空间复杂度依旧是
O
(
n
)
O(n)
O(n)
当序列恰好平衡的时候,就是每次轴值都恰好能把序列分两半的时候,
这样轴值就是:
这样递归深度就是
O
(
log
2
n
)
O(\log_2^n)
O(log2n)