演算法和資料結構
演算法和資料結構——千絲萬縷的聯絡
縱觀各種演算法書籍,大多都是將演算法和資料結構作為一個整體來講述。
資料結構就是陣列、樹結構等儲存或表現物件資料的結構。
將演算法和資料結構作為整體講述,是因為必須依照演算法中的常用操作選擇資料結構。例如,事先將資料儲存在適當的樹形結構中,大多數情況下搜尋會變得很簡單,可以降低複雜度。
第11課中已經看到,RDBMS的索引的實現採用了B+樹這種樹結構。B+樹是個空間上適合外部儲存的樹結構。利用B+樹儲存索引,不僅能減少查詢所需的操作步驟,還能將磁碟讀取次數降至最低。因此,RDBMS的索引一般採用B+樹,同時使用適合該資料結構的演算法進行查詢、插入、排序等操作。
所以說,演算法和資料結構之間存在著千絲萬縷的聯絡。
演算法和資料結構
資料結構
陣列、樹結構、堆……
根據演算法常用操作進行選擇
要根據演算法常用操作來選擇資料結構
計算量的複雜度記法忽略了所有“常數項”。所謂常數項就是演算法實現中不依賴於輸入大小,但卻不得不執行的一類處理。
例如函式呼叫、函式返回等處理都是常數項,第一次分配變數、if語句分支等也是常數項。簡單的實現中,常數項幾乎不會影響演算法的複雜度,但在複雜的實現中,常數項就不可忽略了。就算實現不復雜,CPU快取是否容易生效、分支預測是否發生等計算機結構特點也會有影響,因此常數項可能會導致差距。
例如,例如排序演算法的理論下限為O(n log n),有幾個演算法的平均複雜度能達到O(n log n)。但是,同為O(n log n),一般而言快速排序是最快的。快速排序的特點使得CPU快取容易生效,這一點比其他演算法好得多。這就是常數項較小的例子。
也就是說,複雜度記法適用於比較演算法,但在實現時不應只考慮複雜度。而且常數項經常取決於實現方法,因此實現時要盡力減小常數項。
實現時要注意的最佳化問題
另一方面希望大家注意,實現某樣東西(不僅限於演算法)時,一開始就對常數項進行最佳化,基本上是錯誤的。努力減少複雜度為O(n2)的演算法的常數項,還不如用O(n log n)的演算法來代替,那樣改善效果更好。
說來說去,還是“評測最重要”。透過評測(benchmark)或分析(profiling)等手段,正確找出當前程式的問題所在最為重要。是要更換演算法來改善,還是減少常數項來改善,或者是物理資源不足要更換硬體以改善效能?務必在認真找出問題所在之後,再設法改善。
本文節選自《大規模WEB服務開發技術》一書
圖書詳細資訊:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-705176
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-705277/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料結構和演算法資料結構演算法
- 資料結構和演算法-堆資料結構演算法
- 聊聊資料結構和演算法資料結構演算法
- JavaScript資料結構和演算法JavaScript資料結構演算法
- python演算法與資料結構-演算法和資料結構介紹(31)Python演算法資料結構
- 資料結構和演算法總結--棧資料結構演算法
- JavaScript 的資料結構和演算法JavaScript資料結構演算法
- 資料結構和演算法:遞迴資料結構演算法遞迴
- 資料結構和演算法之-列表資料結構演算法
- Java的資料結構和演算法Java資料結構演算法
- 資料結構與演算法-資料結構(棧)資料結構演算法
- Java資料結構和演算法(一)連結串列Java資料結構演算法
- CHC5223資料結構和演算法資料結構演算法
- 資料結構和演算法(六)佇列資料結構演算法佇列
- 快速入門資料結構和演算法資料結構演算法
- 資料結構和演算法之——跳錶資料結構演算法
- 演算法和資料結構-簡版1演算法資料結構
- leetcode演算法資料結構題解---資料結構LeetCode演算法資料結構
- 資料結構:初識(資料結構、演算法與演算法分析)資料結構演算法
- js資料結構和演算法(9)-排序演算法JS資料結構演算法排序
- 【PHP資料結構】PHP資料結構及演算法總結PHP資料結構演算法
- 資料結構&演算法資料結構演算法
- JavaScript 的資料結構和演算法 - 連結串列篇JavaScript資料結構演算法
- 資料結構基礎和演算法題系列總結資料結構演算法
- 為什麼演算法和資料結構重要?演算法資料結構
- JavaScript 的資料結構和演算法 - 前言篇JavaScript資料結構演算法
- 資料結構和演算法-切片實現棧資料結構演算法
- JavaScript 的資料結構和演算法 - 棧篇JavaScript資料結構演算法
- 資料結構和演算法:二叉樹資料結構演算法二叉樹
- 資料結構和演算法-雜湊表 (HashTable)資料結構演算法
- 結構化資料、半結構化資料和非結構化資料
- 資料結構和演算法——棧的面試演算法資料結構演算法面試
- 資料結構和演算法的圖解和實現資料結構演算法圖解
- Java資料結構和演算法(六)—演算法—反轉連結串列Java資料結構演算法
- 資料結構與演算法:圖形結構資料結構演算法
- python演算法與資料結構-什麼是資料結構Python演算法資料結構
- 資料結構和演算法面試題系列—連結串列資料結構演算法面試題
- 資料結構演算法題資料結構演算法
- 資料結構與演算法資料結構演算法