《算法導論》筆記(一)

《算法導論》網易公開課地址

性能的重要

可拓展性,安全等似乎比性能更爲重要,但性能像底部的貨幣,程序以性能爲基礎,沒有性能就沒有一切。特別當你研發新產品時,性能更爲重要

插入法排序

sorts A[1~n]
pseudocode(僞代碼)

for j<-2 to n
    do key <- A[j]
        i<-j-1
            while i>0 and A[i]>key
                do A[i+1]<-A[i]
                    i<-i-1
            A[i+1]<-key

注意這裏的數組下標是從1開始
下面用c++實現

#include<iostream>

using namespace std;

void main()
{
    int A[8]={8,3,5,9,6,5,2,0},i,j,key;

    for(j=1;j<8;j++)
    {
        key=A[j];
        i=j-1;
        while(i>=0&&A[i]>key)
        {
            A[i+1]=A[i];
            i--;
        }
        A[i+1]=key;
    }

    cout<<"the consequence is "<<endl;
    for(i=0;i<8;i++)
    {
        cout<<A[i]<<endl;
    }
}

因爲c/c++中數組下標從0開始,所以有小改動。

插入法什麼意思?
首先選擇一個值爲key值(從第二個數起選擇),然後向前去尋找它應該在的位置。
當A[i]是比key大(從小到大排序),說明key至少在A[i]前面,此時把A[i]往後挪,不斷重複(第一次挪會導致key原本的位置被佔)。當發現A[i]小於等於key,就把key放到A[i]的後一個。

拿一組數據:8,2,4,9,3
首先選取2爲key,往前比較,發現8比2大,又是第一個位置,所以:
2,8,4,9,3
接着4爲key值,往前比較,發現8比4大,2又小於4,所以
2,4,8,9,3
9爲key值,8不比9大,所以9在原位
2,4,8,9,3
3爲key值,9比3大,所以
2,4,8,9,9
3繼續往前比,8比3大,所以
2,4,8,8,9
繼續
2,3,4,8,9
完成,相當於3直接插入2與4之間,在尋找位置插入過程中key可能在原數組中是沒有的。

可以發現,新選一個key時,這個數以前的數組是已經排好序的

running time

  • 輸入(input),如果輸入的數越接近排序好的結果,算法要做的越少
  • 數據規模(input size)
  • 上限(upper bounds)知道最少會運行的時間用處不大

  • worst case(usually),只關注最大值(max time)
  • average case (sometimes),期望時間(expected time)
  • best case(bogus),不可能發生

插入法運算時間

  • depends on computer
    • relative speed 不同算法在同一臺機器的運算快慢
    • absolute speed

asymptotic analysis 漸近分析

  1. 忽略依賴機器的常量
  2. 關注運行時間的增長

asymptomatic notation 漸近符號

θ ,捨棄低階項,並忽略常數。例如3n3+90n25n+6064 ,就等於θ(n3)

歸併排序(merge sort)

sort A[1~n]
1. if n=1 done 如果只有一個數,肯定已經排好序
2. 遞歸地(recursively)排序A[1~n2 ]和A[n2 ~n], n2 向上取整。
3. 歸併(merge)兩個表

歸併merge

現在有兩張表(list):

20,13,7,2
12,11,9,1

先比較兩個表各自最小的數,把1拿出來,於是

20,13,7,2
12,11,9

接着比較剩餘部分,兩個表中最小的是2,再把2拿出來,於是

20,13,7
12,11,9

而結果部分已經有

1,2

重複,繼續比較兩個表中各自最小的數把小的那個拿出來

歸併時間T(n)=θ(n) ,線性時間

總的歸併排序時間T(n)=2T(n2)+θ(n) ,n>1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章