duyifei0 2019-06-27
算法的特征:
常用算法
复杂度
时间复杂度和空间复杂度
常见的复杂度
$$a_1,a_2,...a_n 排序全排列的时间复杂度为 n!$$
$$ 当 a_i< a_j时$$
$$复杂度变为: \frac{n!}{2}$$
$$当有k个关系时,每次都能排除一般的可能$$
$$复杂度为: \frac{n!}{2^k}$$
$$令: \frac{n!}{2^k} = 1 即 n!=2^k$$
$$k=\log_{2}{n!} < \log_{2}{n^n}=n\log_{2}{n}=n\frac{\log n}{\log2}< n\log{n}$$
以上为推导过程
8. O($2^N$): 枚举全部的子集 注意:一个集合全部子集的数量是2^N
9. O($N!$): 枚举全部排列总结:
$$O(1) < O(\log{n}) < O(\sqrt{n} < O(n) < O(n\log{n}))$$
$$O(n^2)< O(n^3)< O(2^n)< O(n!)$$
$$(1000)^2=1亿; (465)^3=100,544,625; 12!=479001600$$
1. 输入输出
1. N个数组求和,时间复杂度下限为: O(n)
2. 输出全排列的复杂度在O(n!)以上
2. 循环次数
eg: 循环嵌套的复杂度至少是O(n^2)
for(i...n)
for(i...n)
3. 均摊分析法
多个操作一起计算时间复杂度
eg1: MULTIPOP的队列,可以一次性出队k个元素,但每个元素出入队列只能有一次
eg2: 动态数据尾部插入操作(C++中是vector,java中是ArrayList)
一旦元素超过容量限制,则重新扩大并分配空间,将旧数据复制到新的内存地址上。
有空间的情况下复杂度是O(1)
空间满了再扩大的时候的复杂度是O(n)
重新分配k次的复杂度是O(2^n)$$O(1)+O(2)+O(4)+...+O(2^n)=O(2^n-1)$$