資料結構大學教程之資料結構及其基本概念 2

2021-03-31 08:56:32 字數 2781 閱讀 7612

1.3 演算法和演算法分析

algorithms and algorithm analysis

1.3.1演算法

所謂演算法(algorithm)是對問題求解步驟的一種描述,是指令的有限序列,其中每一條指令表示乙個或多個操作。在clrs中是這樣給出演算法的定義的:informally, an algorithm is any well-defined ***putational procedure that takes some value, or set of values, as input and produces some value, or set of values, as output. an algorithm is thus a sequence of ***putational steps that transform the input into the output.

乙個演算法必須滿足以下五個重要特性:

1.有窮性 對於任意一組合法輸入值,在執行有窮步驟之後一定能結束,即:演算法中的每個步驟都能在有限時間內完成;

2.確定性 對於每種情況下所應執行的操作,在演算法中都有確切的規定,使演算法的執行者或閱讀者都能明確其含義及如何執行。並且在任何條件下,演算法都只有一條執行路徑;

3.可行性 演算法中描述的操作都可以通過已經實現的基本操作運算有限次實現之;

4.有輸入 作為演算法加工物件的量值,通常體現為演算法中的一組變數。有些輸入量需要在演算法執行過程中輸入,而有的演算法表面上可以沒有輸入,實際上已被嵌入演算法之中;

5.有輸出 它是一組與輸入有確定關係的量值,是演算法進行資訊加工後得到的結果。

1.3.2演算法設計的原則

設計演算法時我們應當嚴格考慮:

1.正確性(correctness)

首先,演算法應當滿足以特定的「規格說明」方式給出的需求。對演算法是否「正確」的理解可以有以下四個層次:

a.程式中不含語法錯誤;

b.程式對於幾組輸入資料能夠得出滿足要求的輸出結果;

c.程式對於精心選擇的、典型、苛刻的幾組輸入資料能夠得出滿足要求的結果;

d.程式對於一切合法的輸入資料都能得出滿足要求的結果;

通常以第c層意義的正確性作為衡量乙個演算法是否合格的標準。因為作為輸入,我們有時候不可能提前做出所有的預期。

2. 可讀性(readability)

演算法主要是為了人的閱讀與交流,其次才是為計算機執行。因此演算法應該易於人的理解;另一方面,晦澀難讀的程式易於隱藏較多錯誤而難以除錯;有些程式設計者總是把自己設計的演算法寫的只有自己才能看懂,這樣的演算法反而沒有太大的價值。

3.健壯性(rubustness)

當輸入的資料非法時,演算法應當恰當地作出反映或進行相應處理,而不是產生莫名奇妙的輸出結果。這就需要我們一定要充分的考慮異常情況(unexpected exceptions)並且,處理出錯的方法不應是中斷程式的執行,而應是返回乙個表示錯誤或錯誤性質的值,以便在更高的抽象層次上進行處理。

4.高效率與低儲存量需求

通常,效率指的是演算法執行時間;儲存量指的是演算法執行過程中所需的最大儲存空間。兩者都與問題的規模有關。

1.3.3演算法效率的衡量方法與準則

通常有兩種衡量演算法效率的方法:

1.事後統計法

缺點:

(1)必須執行程式才能進行判斷

(2)其它因素(如硬體、軟體環境)掩蓋演算法本質

2.事前分析估算法

1.演算法選用的策略

2.問題的規模

3.編寫程式的語言

4.編譯程式產生的機器**的質量

5.計算機執行指令的速度

乙個特定演算法的「執行工作量」的大小,只依賴於問題的規模(通常用整數量n表示),或者說,它是問題規模的函式。假如,隨著問題規模n的增長,演算法執行時間的增長率和f(n)的增長率相同,則可記作:

t (n) = o(f(n))

稱t (n) 為演算法的漸近時間複雜度(asymptotic time ***plexity),簡稱時間複雜度。o是數量級的符號。

下面我們**一下如何估算演算法的時間複雜度

演算法 = 控制結構 + 原操作(固有資料型別的操作)

演算法的執行時間=原操作(i)的執行次數×原操作(i)的執行時間

演算法的執行時間與原操作執行次數之和成正比

我們先介紹乙個概念:

for(j=1;j<=n;++j)

for(k=1;k<=n;++k)

語句重複執行的次數被稱為語句的頻度(frequency count)上程式段中++x的語句頻度就是n2。

我們經常採用:從演算法中選取一種對於所研究的問題來說是基本操作的原操作,以該基本操作在演算法中重複執行的次數作為演算法執行時間的衡量準則。這個原操作多數情況下是最深層次迴圈內的語句中的原操作。

例如:

for (i=1; i<=n; ++i)

for (j=1; j<=n; ++j)

該演算法的基本操作是乘法操作。時間複雜度為 o(n3)

1.3.4演算法的儲存空間(memory space for algorithms)

演算法的空間複雜度s(n) = o(g(n))

表示隨著問題規模n的增大,演算法執行所需儲存量的增長率與g(n)的增長率相同。

演算法的儲存量包括:

1.輸入資料所佔空間;

2.程式本身所佔空間;

3.輔助變數所佔空間。

若輸入資料所佔空間只取決與問題本身,和演算法無關,則只需要分析除輸入和程式之外的額外空間。若所需額外空間相對於輸入資料量來說是常數,則稱此演算法為原地工作。

資料結構及其應用

在程式的世界裡,任何問題或技術的落腳點都是資料結構,所以在學習或研究這些問題或技術時,要注重理解底層或實現過程中所採用的資料結構。本系列會將常用的資料結構進行總結,首先看下樹。一 樹常用的樹形資料結構有 搜尋二叉樹 平衡二叉樹 紅黑樹 完全二叉樹 1.搜尋二叉樹 父子節點滿足大小關係,左子樹都小於根...

C 基礎教程之資料結構

c c 陣列允許定義可儲存相同型別資料項的變數,但是結構是 c 中另一種使用者自定義的可用的資料型別,它允許您儲存不同型別的資料項。結構用於表示一條記錄,假設您想要跟蹤圖書館中書本的動態,您可能需要跟蹤每本書的下列屬性 title 標題 author 作者 subject 類目 book id 書的...

Libra教程之 資料結構和儲存

前面的文章我們知道,libra會把所有的資料都儲存在賬本中。為了方便業務邏輯和資料的校驗,這個儲存是以特定的資料結構來實現的,這裡我們叫做驗證的資料結構。驗證的資料結構是通過merkle樹來實現的。如果大家熟悉其他的區塊鏈的話,大家可能知道merkle樹由於其特殊的結構,被用在大多數區塊鏈中。下面我...