資料結構按照視點的不同可分邏輯結構和物理結構。
邏輯結構:
1.集合結構
2.線性結構
3.樹形結構
4.圖形結構
物理結構:
1.順序儲存結構
2.鏈式儲存結構
演算法定義:
演算法是解決特定問題求解步驟的 描述 ,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。
演算法的5個基本特性:輸入、輸出、有窮性、確定性和可行性。
可行性和確定性
可行性:演算法的每一步都必須是可行的,也就是說,每一步都能通過執行有限次數完成。
確定性:演算法的每一步驟都具有確定的含義,不會出現二義性。演算法在一定條件系,只有一條執行路徑,相同的輸入只能有唯一的輸出結果。演算法的每個步驟被精確定義而無歧義。
演算法設計的要求
1、正確性
正確性:演算法的正確性是指演算法至少應該具有輸入、輸出和加工處理無歧義性、能正確反映問題的需求、能夠得到問題的正確答案。
正確性可分四個層次
(1) 演算法程式沒有語法錯誤
(2) 演算法程式對於合法的輸入資料能夠產生滿足要求的輸出結果
(3) 演算法程式對於非法的輸入資料能夠得出滿足規格說明的結果
(4) 演算法程式對於精心選擇的,甚至刁難的測試資料都有滿足要求的輸出結果
層次4是最困難的,我們幾乎不可能逐一驗證所有的輸入都得到正確的結果。因此演算法的正確性在大部分情況下都不可能用程式來證明,而是用數學方法證明的。證明乙個複雜演算法在所有層次上都是正確的,代價非常昂貴。所以一般情況下,我們把層次3作為乙個演算法是否正確的標準。
2. 可讀性
3. 健壯性
當輸入資料不合格時,演算法也能做出相關處理,而不是產生異常或莫名奇妙的結果。
這一點與正確性的第三個層次相似。區別在於健壯性體現在輸入不合格資料時,不至於把程式搞掛。
4. 時間效率高和儲存量低
演算法效率的度量方法
1. 事後統計方法
事後統計方法:這種方法主要是通過設計好的測試程式和資料,利用計算機計時器對不同演算法編制的程式的執行時間進行比較,從而確定演算法效率的高低。
2. 事前分析估算方法
在計算機程式編制前,依據統計方法對演算法進行估算。
經過分析,我們發現,乙個用高階程式語言編寫的程式在計算機上執行時所消耗的時間取決與下列因素:
(1)演算法採用的策略、方法 ☞決定演算法的好壞
(2)編譯產生的**質量 ☞油編譯軟體支援
(3)問題的輸入規模
(4)機器執行指令的速度 ☞看硬體效能
演算法時間複雜度
在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。演算法的時間複雜度,也就是演算法的時間亮度,記作:t(n)=o(f(n))。它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸進時間複雜度,簡稱為時間複雜度。其中f(n)是問題規模n的某個函式。
這樣用大寫o()來體現演算法時間複雜度的記法,稱之為大o記法。
推導大o階方法
1. 用常數1取代執行時間中的所有加法常數
2. 在修改後的執行次數函式中,只保留最高端項
3. 如果最高端項存在且不是1,則去除與這個項相乘的常數
得到的結果就是大o階。
常數階 大o階 o(1)
線性階 大o階 o(n)
分析演算法的複雜度,關鍵是要分析迴圈結構的運**況。
對數階 o(logn)
2x = n,得到x=log2n,所以或者迴圈的時間複雜度為o(logn)。
平方階o(1) < o(logn) < o(n) < o(n2) < o(n3) < o(2n) < o(n!) < o(nn)
最壞情況執行時間是一種保證,那就是執行時間將不會再壞了。在應用中 ,這是一種最重要的需求,通常,除非特別指定,我們提到的執行時間都是最壞情況的執行時間。
平均執行時間是所有情況中最有意義的,因為他是期望的執行時間。
對演算法的分析,一種方法是計算所有情況的平均值,這種時間複雜度的計算方法稱為平均時間複雜度。另一種方法是計算最壞情況下 的時間複雜度,這種方法稱為最壞時間複雜度。一般在沒有特殊說明的情況下,都是指最壞時間複雜度。
演算法空間複雜度
通過計算演算法所需的儲存空間實現,演算法空間複雜度的計算公式記作: s(n) = o(f(n)),其中,n為問題的規模,f(n)為語句關於n所佔儲存空間的函式。
一般情況下,乙個程式在機器上執行時,除了需要儲存程式本身的指令、常數、變數和輸入資料外,還需要儲存對資料操作的儲存單元。若輸入資料所佔空間只取決與問題本身,和演算法無關,這樣只需要分析該演算法在實現時所需的輔助單元即可。若演算法執行時所需的輔助空間相對於輸入資料量而言是個常數,測稱此演算法為原地工作,空間複雜度為o(1)。
通常,我們都試用「時間複雜度」來指執行時間的需求,使用「空間複雜度」指空間需求。當不用限定詞的使用「複雜度」時,通常都是指時間複雜度。
《大話資料結構》
函式的漸進增長 我們現在來判斷一下,兩個演算法a和b哪個更好。假設兩個演算法的輸入規模都是n,演算法a要做2n 3次操作,你可以理解為先有乙個n次的迴圈,執行完成後,再有乙個n次迴圈,最後有三次賦值或運算,共2n 3次操作。演算法b要做3n 1次操作,你覺得它們誰更快呢 準確來說,答案是不一定的 當...
《大話資料結構》
常見的時間複雜度 常見的時間複雜度如下圖所示 常用的時間複雜度所耗費的時間從小到大依次是 o 1 o logn o n o nlogn o n o n 三次方 o 2 n次方 o n!o n n次方 我們前面已經談到了 o 1 常數階 o logn 對數階 o n 線性階 o n 平方階等,至於o ...
《大話資料結構》
線性表 線性表,從某種就能感覺到,是具有像線一樣的性質的表。在廣場上,有很多人分散在各處,當中有些是小朋友,可也有很多大人,甚至還有不少寵物,這些小朋友的資料對整個廣場人群來說,不能算是線性表的結果。但像剛才提到的那樣,乙個班級的小朋友,乙個跟著乙個排著隊,有乙個打頭,有乙個收尾,當中的小朋友,每乙...