算法的特徵:java
經常使用算法面試
複雜度算法
時間複雜度和空間複雜度數組
常見的複雜度優化
$$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}$$
以上爲推導過程code
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)$$