1. 程式人生 > >資料結構與演算法之一

資料結構與演算法之一

視訊解析  https://edu.csdn.net/course/play/7813
電腦科學是通過使用計算機解決各種問題的研究領域。 為了使用計算機解決給出的問題,您需要為其設計演算法。 可設計多個演算法來解決特定的問題。 提供了最大效率的演算法應用於解決此問題。 演算法的效率可通過使用合適的資料結構來改善。 資料結構幫助建立簡單、可重用和易於維護的程式。 本模組允許學員選擇並實現合適的資料結構和演算法來解決特定
的程式設計問題。


解決問題時演算法和資料結構的作用
問題解決是每個科學規律的必要部分。 計算機廣泛用於解決與各個域有關的問題,例如銀行、商業、醫療、製造和 運輸。 為了使用計算機解決給出的問題,您需要為其編寫程式。 程式由兩個元件組成,即演算法和資料結構。
演算法這個詞來源於波斯數學名稱 Al-Khowarizmi
演算法可定義為解決問題的逐步程式。 演算法幫助使用者在有限的步驟中到達正確的結果。

演算法具有 5 個重要的屬性: 有限性 明確性 ( 確定目的 ) 輸入 輸出 有效性

只要可以為其編寫演算法,通過使用計算機可以解決問題。 此外,演算法提供了以下好處:
幫助編寫對應的程式 幫助區分一系列可以解決的小問題和難以解決的問題 決策制定成為更加理性的過程 使得過程一致和可靠

資料結構的作用
可使用不同的演算法來解決相同的問題。 一些演算法可能比其它演算法更有效地解決問題。 應使用提供最大效率的演算法來解決問題。 改善演算法效率的其中一個基本技巧是使用 適當的資料結構 資料結構被定義為在記憶體中互相組織各個資料元素的方式。

資料可以按許多不同的方式來組織。因此,您可以建立儘可能多的資料結構。 經過多年已經證明很有用的一些資料結構是:  資料型別也是基本資料結構. 陣列 連結串列 堆疊 佇列
合適資料結構的使用有助於提高程式的效率。 使用合適的資料結構還允許您克服一些其它程式設計挑戰,如: 簡化複雜的問題 建立標準的可重用的程式碼元件 建立易於理解和維護的程式
資料結構的型別
資料結構可分為以下兩類: 靜態:例子陣列 動態:例子連結表
設計演算法時兩個常用的技巧是: 分治法 貪婪法

分治法是解決概念性困難問題的強大方法。 分治法需要你找出一個方法: 將問題細分為子問題 解決微不足道的用例 組合到子問題的解決方案以解決原始問題
基於貪婪法的演算法用於解決優化問題,其中您需要在給定的條件集合中最大化利潤或最小化成本。 優化問題的一些示例包括: 找出從始發城市到一組目標城市的最短距離,給出兩個城市之間的距離。 找出某個金額所需的貨幣票據的最小數值,其中有每個命名的任意票據數。 從給出的項集合中選擇具有最大值的項,其中所選項的總重量不能超過給出的值。
遞迴: 遞迴指的是按照本身定義過程的技巧 用於解決本來重複的複雜程式設計問題 通過使用遞迴程式或函式,遞迴可以在程式中實現。遞迴程式或函式是呼叫本身的函式。 遞迴的主要好處是可用於編寫清晰、簡短和簡單的程式 最簡單的一個小例子:從前有座山,山裡有個老和尚,….
課間思考
明確在嘗試找出前面n個自然數之和的以下演算法中的問題:       演算法:Sum (n)       1. s = n + Sum(n 1)       2. Return (s)

答案: 在給出的遞迴演算法中沒有結束條件。因此,可以無限呼叫自身。正確的演算法為:     
  1. If (n = 1)       Return(1)   2. s = n + Sum(n – 1)   3. Return(s)

確定演算法的效率
影響程式效率的因素包括: 機器速度 編譯器 作業系統 程式語言 輸入大小 除了這些因素,程式的方式資料被組織且用於解決此問題的演算法還對程式的 效率具有重大影響。

通過確定消耗的資源量,可以計算演算法的效率。 演算法消耗的主要資源是: 時間: 執行演算法所需的 CPU 時間。 空間: 執行演算法時所用的記憶體量。 演算法使用的資源越少,效率越高。
時間 / 空間權衡 指的是您可以在程式執行速度較慢時可以減少使用的記憶體或在使用記憶體的成本很 高時減少執行的時間。 可以應用時間 / 空間權衡的情形示例為資料儲存。 記憶體是可擴充套件的,但時間卻不可以。因此, 通常考慮 時間 要比考慮記憶體的情 況多。
為了測量演算法的時間效率,您可以根據演算法編寫程式,執行程式並測量執行 程式所需的時間。 您按這種方式測量的執行時間將取決於大量因素,例如: 機器的速度 編譯器 作業系統 程式語言 輸入資料 但是,您要確定執行時間是如何受演算法的性質影響的。
演算法的執行時間直接與演算法中涉及的關鍵比較成比例,並且它是 n 的函式, 其中 n 是輸入資料的大小。 演算法的 執行時間 隨著輸入 資料量的增加而增加 速率 稱為演算法增長的階。 演算法 增長的階 使用 O 號來定義。 O 符號已經接受為說明演算法效率的基礎技巧。

增長的階與其對應的大 O 符號之間的不同是: 常量 - O(1) 對數 - O(log n) 線性 - O(n) 重對數 - O(n log n) 二次方程 - O(n 2 ) 立方 - O(n 3 ) 指數 - O(2 n ), O(10 n )

根據增長階,大 O 符號可按照遞增階的方式排列:      O(1) < O(log n) < O(n) < O(n log n) < O(n 2 ) < O(n 3 ) < O(2 n )      < O(10 n )

分組討論:所選演算法的效率依賴性 問題描述: 您需要編寫演算法以搜尋字典中給定的單詞。討論組織致電資料的不同演算法和不 同方式如何影響程序的效率。

小結

在本章中,你已經學到: 演算法可定義為解決問題的逐步程式,在有限的步驟內產生正確的結果。 演算法具有 5 個重要的屬性: 有限性 明確性 輸入 輸出 有效性 提供了最大效率的演算法應用於解決此問題。

資料結構可分為以下兩類: 靜態 動態 設計演算法時兩個常用的技巧是: 分治法 貪婪法 遞迴指的是按照本身定義過程的技巧。用於解決本來重複的複雜程式設計問題。 演算法消耗的主要資源是: 時間:執行演算法所需的 CPU 時間。 空間: 執行演算法所用的記憶體量。

時間 / 空間權衡指的是您可以為了減慢程式執行的速度而減小記憶體的使用量,或 在減少執行時間的同時提高使用的記憶體。 演算法的總執行時間直接與演算法中涉及的比較次數成比例。 演算法增長的階使用大 O 符號來定義。