南大算法設計與分析課程復習筆記(1) L1 - Model of computation


一、計算模型

1.1 定義:

我們在思考和處理算法的時候是機器無關、實現語言無關的。所有的算法運行在一種“抽象的機器”之上,這就是計算模型。 

1.2 種類

圖靈機是最有名的計算模型,本課使用更簡單更合適的RAM計算模型。

1.3 RAM(Random Access Machine)模型

RAM模型的基本構成如下:

RAM計算模型有如下特點:

  • 一個簡單操作花費一步:鍵值比較、加減、內存訪問
  • 沒有操作可以被分解:循環、子程序
  • 內存:訪存是一個簡單操作、無限制的內存

二、算法設計

2.1 算法問題規約

將算法問題嚴格的定義為精確限定輸入\輸出的“規約”形式:

  • 輸入:明確定義了算法接受的所有合法輸入
  • 輸出:明確定義了對於每一個合法的輸入值,相應的輸出值應該是什么

例子1:

Euclid算法,輾轉相除法的算法實現,計算m、n的最大公約數

輸入:非負整數m,n

輸出:gcd(m,n)

int Euclid(int m, int n) {
    if (m <= n)
        swap(m,n);
    while (m%n != 0) {
        n = m%n;
        m = n;
    }
    return n;
}

//這是測試用例
int main()
{
    cout << Euclid(15,12) << endl;

    system("pause");
    return 0;
}
View Code

例子2:

順序搜索,在一個數組中搜尋一個具體的數

輸入:關鍵字K,數組E[1...n]

輸出:如果K在E中,返回K在E中的位置,如果不在則返回-1

int SequentialSearch(vector<int> e, int k) {
    for (int i = 0; i < e.size(); ++i)
        if (k == e[i])
            return i;
    return -1;
}

//這是測試用例
int main()
{
    vector<int> e = {1,2,3,4,5,6};
    cout << SequentialSearch(e,8) << endl;

    system("pause");
    return 0;
}
View Code

2.2 算法正確性的證明:數學歸納法

EUCLID算法正確性的證明:

當n=0時,對於任何m,有Euclid(m,0)=0

假設當n<=N時成立,考慮n=N+1的情況:

  先有Euclid(m, N+1) = Euclid(N+1, m mod (N+1) ) ,而m mod(N+1)<=N恆成立,根據假設可知Euclid(N+1, m mod (N+1) )總能得出正確的答案,即n=N+1得證。

三、算法分析

3.1 算法的性能指標

  • 時間復雜度
  • 空間復雜度

  在RAM中,時間復雜度使用RAM中執行簡單操作的個數衡量,空間復雜度使用RAM中寄存器的個數來衡量。這樣,對算法的性能分析變成了一個計數問題。由於RAM是抽象的,所以我們的衡量指標也是機器無關、語言無關的。

3.2 最壞情況復雜度

最壞復雜度的含義是最壞的輸入對於的復雜度

例子:

在順序搜索之中,待搜索的數k在數組e的位置越靠后,所需要搜尋的次數也就越多,當k在e的最后一個,此時為最壞情況。

3.3 平均情況復雜度

僅僅靠最壞情況時間復雜度不能充分代表算法性能。可以采用平均情況下的復雜度。

  • 明確算法所有輸入的分布情況
  • 計算期望

例子:

對於順序搜索的問題,給定數組為E[],長度為n,搜尋目標為K,假設所有輸入情況等概率的出現。則成功的平均概率應該如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM