近期我的一个学弟参加了一部分面试, 说是经常会被问到有关算法的时间复杂度问题,虽然我对于算法也是一般的水平,但是我写了这样一篇类似于介绍或者说是总结类的东西给他,顺便自己也温习一下,也就顺带着发在这里了,大神请无视,如有错误,请不吝指正,不胜感激。转载请注明出处。
时间复杂度
把算法程序中的每一步看做一个基本的计量单位,那么一个算法的执行时间就可以看做解决一个问题所需要的总步数。由于算法的执行过程又各不相同,所以每一步(计量单位)怎麽去选择就成为一个问题。
T(n) = n 1, 当数据的规模越来越大时,T(n)函数中的某一部分掩盖了其他部分对函数的影响。
数量级 函数用来描述当规模n增加时,T(n)函数中增长最快的的部分,这个数量级函数我们一般用大O表示,记做 O(f(n0))。
有时算法的运行时间,不仅取决于问答题规模的大小,还取决于具体数据:这样的算法,我们将它的执行情况分为 最有情况、最坏情况、平均情况。
最好情况:某个特定的数据集能让算法的执行情况极好。
最坏情况:另一个不同的数据会让算法的执行情况变得极差
平均情况:大多数数据介于两种极端情况之间。
最坏情况提供了一种保证,这个保证运行时间将不会在坏了,所以通常我们说的时间复杂度都是最坏情况下的时间复杂度。
O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(n³) < O(2ⁿ)
对数函数: cnt = 1
while cnt < n :
cnt *= 2 #看成是cnt乘以多少个2以后才能大于等于n, 2的x次方等于n, x = ㏒n
a= 1
b = 2
c = 3 #执行次数3
for i in range(n):
for j in range(n):
x = i * i
y = j * j
z = i * j #执行次数3n²
for k in range(n):
u = a*k + b
v = c*c #执行次数2n
d = 4 #执行次数1
T(n) = 3 + 3n² + 2n + 1 = 3n² + 2n + 4
看到此算法以n²作为主导,所以当n 增大时,这片代码的数量级就是O(n²)
空间复杂度
该算法所耗费的存储空间 ,计算公式 S(n) = O(f(n)) 其中n为数据的规模,f(n)在这里指的是n所占存储空间的函数。
本文围绕算法的时间复杂度和空间复杂度展开。介绍了时间复杂度,将算法执行时间看作解决问题的总步数,有最好、最坏、平均情况,通常说的是最坏情况,还给出复杂度大小关系示例;也提及空间复杂度,其计算公式为S(n) = O(f(n))。
6563

被折叠的 条评论
为什么被折叠?



