程式 = 資料結構 + 演算法
1. 緒論
1) 邏輯結構
a) 集合結構:同屬於乙個集合外沒有關係
b) 線性結構:元素之間存在一對一關係
c) 樹形結構:一對多
d) 圖形結構:多對多
2) 物理結構
a) 如何把資料元素存放到計算機的儲存器中,針對記憶體而言,像硬碟、軟盤、光碟等外部儲存器的資料結構組織通常使用檔案結構來描述。
b) 元素的儲存結構形式有兩種:順序儲存和鏈式儲存。
4) 鏈式儲存:把資料元素存放在任意的儲存單元裡,這組儲存單元可以連續,也可以不連續。並使用乙個指標存放資料元素的位址,通過位址找到相關的資料元素的位置。
2. 演算法
1) 概念:演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有序序列,並且每條指令表示乙個或多個操作。
2) 基本特性:輸入、輸出、有窮性、確定性和可行性
a) 輸入:——演算法具有0個或多個輸入。
b) 輸出:——至少有乙個或者多個輸出。輸出的形式可以是列印輸出或者是返回乙個值或者多個值。
c) 有窮性:——演算法在執行有限步驟之後,自動結束而不會出現無限迴圈,並且每乙個步驟在可接受的時間內完成。
d) 確定性:——每乙個步驟都具有確定的含義,不會出現二義性。
——演算法在一定的條件下,只有一條執行的路徑,相同的輸入只能有唯一的輸出結果。
——演算法的每個步驟都應該被明確的定義而無歧義。
e) 可行性:——演算法的每一步都是可行的,也就是說,每一步都能夠通過執行有限次數完成。
3) 演算法設計要求
a) 乙個問題有多種解決演算法,使用最快捷方便的。
b) 正確性:演算法至少應該具有輸入、輸出和加工處理無歧義性、能正確反映問題的需求,能夠得到問題的正確答案。
——大體分為四個層次
l 演算法程式沒有語法錯誤。
l 演算法程式對於合法輸入能夠產生滿足要求的輸出。
l 演算法程式對於非法輸入能夠產生滿足規格的說明。
l 演算法程式對於故意刁難的測試輸入都有滿足要求的輸出結果。
e) 時間效率高和儲存量低
3. 時間複雜度和空間複雜度
1) 演算法效率的度量方法
a) 事後統計方法:通過設計好的測試程式和資料,利用計算機計時器對不同演算法寫好的程式執行時間進行比較,從而確定演算法的效率。(不推薦使用)
b) 事前分析估算方法:在程式編寫前依據統計方法對演算法進行估算。
c) 演算法的效率取決於:採用的演算法方案、編譯產生的**質量、問題的輸入規模、機器執行指令的速度。
不考慮軟硬體問題,乙個程式執行時間依賴於演算法的選擇和問題輸入的規模。
d) 分析乙個演算法的執行時間時,重要的是考慮基本操作的數量和輸入的規模。
e) 函式的漸進增長: 給定兩個函式f(n)和g(n),如果存在乙個整數n,使得對於所有的n > n,f(n)總是比g(n)大,那麼,我們說f(n)的漸近增長快於g(n)。
判斷乙個演算法的效率是,函式中的常數和其他次要項一般可以忽略。重要的是主項(最高項)的階數。
判斷乙個演算法的好壞,需要大量資料測試,這樣才能得到更加精準的測試結果。
2) 時間複雜度:在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作:t(n)=o(f(n))。它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸近時間複雜度,簡稱為時間複雜度。其中f(n)是問題規模n的某個函式。這樣用大寫o( )來體現演算法時間複雜度的記法,我們稱之為大o記法。 一般情況下,隨著n的增大,t(n)增長最慢的演算法為最優演算法。
a) 執行的次數==時間
b) 推導大o階:
l 用常數1取代執行時間中的所有加法常數。
l 在修改後的執行次數函式中,只保留最高端項。
l 如果最高端項存在且不是1,則去除與這個項相乘的常數。得到的結果就是大o階。
c) 常用的時間複雜度所耗費的時間從小到大依次是
o(1) < o(logn) < o(n) < o(nlogn) 2) < o(n3) < o(2n) < o(n!) n)
3) 演算法空間複雜度:指執行完乙個程式所需記憶體的大小。
a) 固定部分。這部分空間的大小與輸入/輸出的資料的個數多少、數值無關。主要包括指令空間(即**空間)、資料空間(常量、簡單變數)等所佔的空間。這部分屬於靜態空間。
b) 可變空間,這部分空間的主要包括動態分配的空間,以及遞迴棧所需的空間等。這部分的空間大小與演算法有關。
c) 乙個演算法所需的儲存空間用f(n)表示。s(n)=o(f(n)) 其中n為問題的規模,s(n)表示空間複雜度。f(n)為語句關於n所佔儲存空間的函式。
d) 通常的「複雜度」指的是時間複雜度。
資料結構與演算法筆記 01 概念
演算法效率衡量 時間複雜度和大o表示法 時間測量模組 python列表型別的時間效率 python列表和字典的時間複雜度 常見時間複雜度 資料結構和演算法是程式設計師的兵法,用於提高 執行效率和效能 演算法演算法是計算機處理資訊的本質,程式本質上是乙個演算法來告訴計算機確切的步驟來執行乙個指定的任務...
java資料結構與演算法學習筆記(1) 概念
今天覆習了資料結構,才發現很多概念都不懂,或是沒有分清楚。晚上跟mzd討論的時候,發現我們都對資料結構的某些地方都存在著誤解。因此深感弄清概念的重要,至少弄清概念可以應付二級 資料結構 資料結構是計算機儲存 組織資料的方式。資料元素相互之間的關係 稱為結構。有四類基本結構 集合 線性結構 樹形結構 ...
資料結構與演算法概念
資料結構是個抽象的概念,所以並沒有官方的定義,資料結構 演算法於應用 中是這樣來定義的 資料結構是資料物件,以及存在於該對像的例項以及組成例項的資料元素間的各種聯絡,這種聯絡可以通過定義相關函式來給出。我所理解的資料結構是資料元素之間的關係所構成的某種集合。樹和圖,就是很好的例子,他們是根據資料元素...