資料結構緒論

2021-10-19 07:31:15 字數 4874 閱讀 5990

typedef

struct

//複數型別

complex;

void

create

(&complex c,

float x,

float y)

float

getreal

(complex)

float

getimag

(complex)

complex add

(complex c1,complex c2)

complex sub

(complex c1,complex c2)

通過這樣定義後,就可以在主程式中通過呼叫create函式構造乙個複數,通過呼叫add或sub函式實現複數的加法或者減法運算,使用者可以像使用整數型別那樣使用複數型別了。

1.4******演算法和演算法分析

在資料結構中,將遇到大量的計算問題,因為演算法聯絡著資料在計算過程中的組織方式,為了實現某種操作,常常需要設計演算法,因而演算法是研究資料結構的重要途徑。

1.4.1演算法的定義及其特性

演算法是為了解決某類問題而規定的乙個有限長的操作序列。

乙個演算法必須滿足以下5個重要特性。

(1)、有窮性:乙個演算法必須總是在執行有窮步後結束,且每一步都必須在有窮時間內完成,

(2)、確定性:對於每種情況下所應執行的操作,在演算法中都有確切的規定,不會產生二義性。使演算法的執行者與閱讀者都能夠明確其含義及如何執行。

(3)、可行性:演算法中所有操作都可以通過已經實現的基本操作運算執行有限次來實現。

(4)、輸入:乙個演算法有零個或多個輸入。當用函式描述演算法時,輸入往往是通過形參表示的,在它們被呼叫時,從主調函式中獲得輸入值。

(5)、輸出:乙個演算法有乙個或多個輸出,它們是演算法進行資訊加工後得到的結果,無輸出的演算法沒有任何意義。當用函式描述演算法時,輸出多用返回值或引用型別的形參來表示。

1.4.2評價演算法優劣的基本標準

(1)、正確性:在合理的資料輸入下,能夠在有限的執行時間內得到正確的結果。

(2)、可讀性:乙個好的演算法,首先應便於人們理解與相互交流,其次才是機器的可執行性。可讀性強的演算法有助於人們對演算法的理解,而難懂的演算法易於隱藏錯誤,且難於除錯和修改。

(3)、健壯性:當輸入的資料非法時,好的演算法能適當地做出正確反應或進行相應處理,而不會產生一些莫名其妙的輸出結果。

(4)、高效性:高效性包括時間和空間兩個方面,時間高效是指演算法的設計合理,執行效率高,可以用時間複雜度來度量;空間高效是指演算法占用儲存容量合理,可以用空間複雜度來度量。時間複雜度和空間複雜度是衡量演算法的兩個主要指標。

1.4.3演算法的時間複雜度

演算法效率的分析的目的是看演算法實際是否可行,並在同一問題存在多個演算法時,可進行時間和空間上的效能的比較,以便從中挑出最優的演算法。

衡量演算法效率的方法主要有兩類:事後統計法和事前分析估算法,事後統計法需要先將演算法實現,然後測算其時間和空間的開銷,這種衡量方法存在兩個缺陷,乙個是需要把演算法轉換為可執行的程式,二是時空開銷的測算結果依賴於計算機的軟硬體等環境因素,這種演算法易於掩蓋演算法本身的優劣,所以我們經常採用事前分析估算法,通過計算演算法的漸進複雜度來衡量演算法的效率。

1.問題規模和語句頻度

不考慮計算機軟硬體的因素,影響演算法時間代價的最主要因素是問題規模。問題規模是演算法求解問題中輸入量的多少,是問題大小的本質表示,一般用整數n表示。問題規模n對不同問題的含義不同,例如在排序問題中n為參加排序的記錄數,在矩陣運算中n為矩陣的階數,在多項式運算中n為多項式的係數,在集合運算中n為集合中元素的個數,在樹的運算中n為圖的頂點數或邊數,顯然,n越大,演算法的執行時間越長。

乙個演算法的執行時間大致上等於其所有語句執行時間的總和,而語句的執行時間則為該條語句的重複執行次數和執行一次所需要時間的乘積。

一條語句的重複執行次數稱作語句頻度。

由於語句的執行需要由源程式經編譯程式翻譯成目標**,目標**再經裝配執行,執行一次實際所需的時間是與機器的軟硬體(機器速度、編譯程式質量)密切相關。所以,所謂的演算法分析並非精確統計演算法執行所需時間,而是針對演算法中語句的執行次數做出估計,從而得到演算法執行時間的資訊。

設每條語句執行一次所需的具體時間均為單位時間,則乙個演算法的執行時間可用該演算法中所有語句頻度之和來衡量。

如下列問題(求兩個n階矩陣的乘積演算法)

for

(i=1

;i<=n;i++

)//語句頻度為n+1

for(j=

1;j<=n;j++

)//語句頻度為n*(n+1)

該演算法中所有語句的頻度之和,是矩陣階數n的函式,用f(n)表示之,換句話說,上述演算法的執行時間與f(n)成正比。f(n)=2n^3+ 3*n^2+2n+1

通常,演算法的執行時間是是隨問題規模的增長而增長的,因此對演算法的評價通常只需考慮其隨問題規模增長的趨勢。我們只需要考慮當問題規模充分大時,演算法語句的執行次數在漸進意義下的階。

t(n)=of((n))

其表示隨問題規模n的擴大,演算法執行時間的增長率和f(n)的增長率相同,稱做演算法的漸進時間複雜度,簡稱時間複雜度。該定義說明了函式t(n)與f(n)具有相同的增長趨勢,並且t(n)的增長至多趨向於函式f(n)的增長,符號「o」表示增長率的上限。

若演算法可以用遞迴方法表示,,則演算法的時間複雜度通常可以用遞迴方程來表示,此時將涉及遞迴方程求解問題。

常量階示例:

for

(i=0

;i<

10000

;i++

)

線性階示例:

for

(i=0

;i)

平方階示例:

x=0;

y=0;for

(k=1

;k<=n;k++

)for

(i=1

;i<=n;i++

)for

(j=1

;j<=n;j++

) y++

;

立方階示例:

x=1;

for(i=

1;i<=n;i++

)for

(j=1

;j<=i;j++

)for

(k=1

;k<=j;k++

) x++

;

對數階示例:

for

(i=1

;i<=n;i=i*2)

4.最好、最壞和平均時間複雜度

對於某些問題的演算法,其基本語句的頻度不僅僅與問題的規模相關,還依賴於其他的因素。

如在一維陣列a中順序查詢某個值等於e的元素,並返回其所在位置

for

(i=0

;i(a[i]

==e)

return i+1;

return

0;

容易看出,此演算法的語句2的頻度不僅僅與問題規模有關,還與輸入例項中陣列a[i]的各個元素值及e的取值有關,若在第乙個位置取到,那麼其是最好的時間複雜度,若是最後乙個位置,那麼是最壞的時間複雜度,取二者的平均值,就是平均時間複雜度,指演算法在所有可能情況下,按照輸入例項以等概率出現時,演算法計算量的加權平均值。

對演算法時間複雜度的度量,我們更關心的是最壞情況下和最壞情況下的時間複雜度,然而在很多情況下,演算法的平均時間複雜度難以確定。因此,通常只討論演算法在最壞情況下的時間複雜度,,即分析在最壞的情況下,演算法執行時間的上界。在下面所討論的時間複雜度,除了特別指明外,均指最壞情況下的時間複雜度。

1.4.4演算法的空間複雜度

關於演算法的儲存空間需求,類似於演算法的時間複雜度,我們採用漸進空間複雜度作為演算法所需儲存空間的量度。簡稱空間複雜度,它也是問題規模n的函式,記作 s(n)=o(f(n))

一般情況下,乙個機器在機器上執行時,除了需要寄存本身所用的指令、常數、變數和輸入資料外,還需要一些對資料進行操作的輔助儲存空間。其中,對於輸入資料所佔的具體儲存量取決於問題本身,與演算法無關,這樣只需要分析儲存空間就可以了。若輸入資料為乙個常數,則稱這個演算法在原地工作,輔助空間為o(1),與問題規模有關。

如下所示例子可以幫助我們理解演算法的空間複雜度

例:陣列逆序,將一維陣列a中的n個數逆序存放到原陣列中

演算法1:

for

(i=0

;i2;i++

)

演算法2:

for

(i=0

;i) b[i]

=a[n-i-1]

;for

(i=0

;i) a[i]

=b[i]

;

演算法1需要另外借助乙個變數t,與問題規模n大小無關,所以其空間複雜度為o(1)。

演算法2需要另外借助乙個大小為n的輔助陣列b,所以其空間複雜度為o(n)。

對於乙個好的演算法,其時間複雜度和空間複雜度是相互影響的,當追求乙個較好的複雜度時,可能會導致占用更多的儲存空間,即可能會使空間複雜度的效能變差,反之亦然,不過,通常情況下,鑑於運算空間較為充足,人們都以演算法的時間複雜度作為衡量演算法優劣的指標。

1.5 小結

資料結構包括兩個方面的內容:資料的邏輯結構和儲存結構。同乙個邏輯結構採用不同的儲存方法,可以得到不同的儲存結構,

儲存結構是邏輯結構在計算機中的儲存表示,有兩類儲存結構:集合結構、線性結構。

演算法執行時間的數量級稱為演算法的漸進時間複雜度,t(n)=o(f(n)),它表示隨著問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,簡稱時間複雜度。

資料結構 資料結構緒論

資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...

資料結構 緒論

程式 資料結構 演算法 資料 對客觀事物的符號表示。資料元素 資料的基本單位,由若干個資料項組成。資料項是資料不可分割的最小單位。資料物件 性質相同的資料元素的集合,使資料的乙個子集。資料元素是相互之間存在一種或多種特定關係的資料元素的集合。預定義常量型別 函式結果狀態嗎 define true 1...

資料結構緒論

資料結構是一種抽象資料的過程,這種能力是任何工具都無法代替的。學習資料結構的目的 資料結構是計算機專業的基礎,它為幾乎所有的軟體設計的基礎。同時他也培養求解複雜問題的能力。那麼,什麼是資料結構呢,這個概念是很重要的,人月神話上有一段話,說人們往往喜歡將問題分解開來處理,但是這樣一來造成了對整個問題的...