演算法和資料結構

2022-04-07 04:12:42 字數 1446 閱讀 6622

演算法和資料結構

演算法和資料結構—

—千絲萬縷的聯絡

縱觀各種演算法書籍,大多都是將演算法和資料結構作為乙個整體來講述。

資料結構就是陣列、樹結構等儲存或表現物件資料的結構。

將演算法和資料結構作為整體講述,是因為必須依照演算法中的常用操作選擇資料結構。例如,事先將資料儲存在適當的樹形結構中,大多數情況下搜尋會變得很簡單,可以降低複雜度。第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服務開發技術》一書

圖書詳細資訊:

演算法和資料結構

演算法和資料結構 演算法和資料結構 千絲萬縷的聯絡 縱觀各種演算法書籍,大多都是將演算法和資料結構作為乙個整體來講述。資料結構就是陣列 樹結構等儲存或表現物件資料的結構。將演算法和資料結構作為整體講述,是因為必須依照演算法中的常用操作選擇資料結構。例如,事先將資料儲存在適當的樹形結構中,大多數情況下...

演算法和資料結構

演算法 資料結構與演算法的關係是相互依賴不可分割的。演算法的定義 演算法是解決特定問題求解步驟的描述,在計算機中為指令的有限序列,並且每條指令表示乙個或多個操作。演算法的特性 有窮性 確定性 可行性 輸入 輸出。演算法設計的要求 正確性 可讀性 健壯性 高效率和低儲存量需求。演算法特性與演算法設計容...

演算法和資料結構

好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您,一開始或至少在我的情況下,我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟糕,您會告訴我 您知道,您甚...