数据结构
逻辑结构 集合结构 数据元素同属于一个集合 线性结构 数据元素间一对一关系 树形结构 数据元素间一对多关系 图形结构 数据元素间多对多关系 物理结构 顺序存储结构 数据元素存放在地址连续的存储单元里 链式存储结构 数据元素之间的逻辑关系通过指针间接反映对好的算法的评判标准:所需运行时间更少(时间复杂度更低)
占用内存空间更小(空间复杂度更低)
时间复杂度 T(n)=O(n)
O(1)<O()<O(n)<O(n
)<O(
)<O(
)<O(
)<O(n!)<O(
)
O(n!)
阶乘时间复杂度一般出现在与「全排列」相关的算法中。这类算法随着问题规模 n 的增大,对应计算次数呈阶乘关系增长。如:递归
O(
)
对数时间复杂度一般出现在「二分查找」、「分治」这种一分为二的算法中。这类算法随着问题规模 n 的增大,对应的计算次数呈对数关系增长。
def algorithm(n):
cnt = 1
while cnt < n:
cnt *= 2
return cnt
while 循环体中 cnt
从 1 开始,每循环一次都乘以 2。当大于 n 时循环结束。变量 cnt
的取值是一个等比数列:2^0,2^1,2^2...2^x,根据 2^x=n,可以得出这段循环体的执行次数x=。
O(
)
线性对数一般出现在排序算法中,例如「快速排序」、「归并排序」、「堆排序」等。这类算法随着问题规模 n 的增大,对应的计算次数呈线性对数关系增长。
def algorithm(n):
cnt = 1
res = 0
while cnt < n:
cnt *= 2
for i in range(n):
res += 1
return res
上述代码中外层循环的时间复杂度为 O(),内层循环的时间复杂度为 O(n),且两层循环相互独立,则总体时间复杂度为 O(
)。