數據結構與算法之一

基本原理

計算機科學是經過使用計算機解決各類問題的研究領域。
爲了使用計算機解決給出的問題,您須要爲其設計算法。
可設計多個算法來解決特定的問題。
提供了最大效率的算法應用於解決此問題。
算法的效率可經過使用合適的數據結構來改善。
數據結構幫助建立簡單、可重用和易於維護的程序。
本模塊容許學員選擇並實現合適的數據結構和算法來解決特定 的編程問題。



解決問題時算法和數據結構的做用

問題解決是每一個科學規律的必要部分。
計算機普遍用於解決與各個域有關的問題,例如銀行、商業、醫療、製造和 運輸。
爲了使用計算機解決給出的問題,您須要爲其編寫程序。
程序由兩個組件組成,即算法和數據結構。

算法這個詞來源於波斯數學名稱 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 符號來定義。
相關文章
相關標籤/搜索