算法學習筆記1、時空複雜度

面試求職班一筆記

  1. 算法主要研究:時空複雜度
  2. 算法的特徵:java

    1. 有窮性,
    2. 肯定性,
    3. 可行性,
    4. 可能沒有輸入,但必定有輸出
  3. 經常使用算法面試

    1. 窮舉法(eg:求N個數的全排列;8皇后問題)
    2. 減而治之(二分查找——減而治之;歸併排序——分而治之)
    3. 貪心算法(最小生成樹;單源最短路)所謂貪心算法是指,在對問題求解時,老是作出在當前看來是最好的選擇。也就是說,不從總體最優上加以考慮,他所作出的僅是在某種意義上的局部最優解。
    4. 動態規劃(揹包;士兵路徑)
  4. 複雜度算法

    1. 談算法必定要考慮複雜度
    2. 時間複雜度和空間複雜度數組

      1. 時間複雜度:計算機基本操做的次數(彙編指令的條數)+ - * / % 尋址 跳轉
      2. 空間複雜度:所需佔用的內存字節數
      3. 二者區別:空間是能夠返回利用的。
      4. 表示方法:O(n) 忽略常數(高階無窮小)注意:算法複雜度是考慮算法最壞狀況時的複雜度
      5. eg: 快速排序的複雜度 O(n^2),這個就是他的最壞狀況
    3. 常見的複雜度優化

      1. O(1): 基本運算 + - * / % 尋址 跳轉
      2. O(logN): 二分查找
      3. O(N^(1/2)): 枚舉約數
      4. O(N): 線性查找
      5. O(N^2): 樸素最近帶你對
      6. O(N^3): Floyd最短路;普通矩陣乘法
      7. O(NlogN): 歸併排序;快速排序的指望複雜度;基於比較排序的算法下界

$$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!)$$內存

  • 算法估計,計算機1s能運算1億條指令,注意如下數字

$$(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)$$

相關文章
相關標籤/搜索