經常使用數據結構的應用場景小結

一、單向連接算法

單向鏈表適用於只從一端單向訪問的場合,這種場合通常來講:數組

(1)、刪除時,只適合刪除第一個元素;數據結構

(2)、添加時,只直接添加到最後一個元素的後面或者添加到第一個元素的前面;優化

(3)、屬於單向迭代器,只能從一個方向走到頭(只支持前進或後退,取決於實現),查找效率極差。不適合大量查詢的場合。ui

這種典型的應用場合是各種緩衝池和棧的實現。指針

二、雙向鏈表排序

雙向鏈表相比單向鏈表,擁有前向和後向兩個指針地址,因此適合如下場合:索引

(1)、刪除時,能夠刪除任意元素,而只須要極小的開銷;內存

(2)、添加時,當知道它的前一個或後一個位置的元素時,只須要極小的開銷。效率

(3)、屬於雙向迭代器,能夠從頭走到尾或從尾走到頭,但一樣查找時須要遍歷,效率與單向鏈表無改善,不適合大量查詢的場合。

這種典型的應用場景是各類不須要排序的數據列表管理。

三、數組(含Delphi中動態數組)、列表(Delphi/C++ Builder中的TList)向量(C++中std::vector)

這種數據結構使用一段連續的空間來存貯元素,因此能夠直接經過索引來獲取到某個元素,並且能夠經過對元素的內容進行排序,而後使用二分法查找,從而提供查找效率。其適合的場合主要是:

(1)、不會頻繁增刪元素的場合,由於增刪元素都牽涉到元素空間的從新分配,頻繁的內存分配操做會大幅下降操做效率。但添加操做時,能夠經過預分配足夠的空間來優化添加時的效率。

(2)、屬於隨機迭代器,能夠隨機訪問任意元素。對於已排序的元素查找起來效率較高。

四、二叉樹(含紅黑樹、平衡二叉樹等)

這個數據結構相似於雙向鏈表,任意插入元素時都會自動排序,紅黑樹和平衡二叉樹都使二叉樹儘可能平衡,從而使查詢時和二分法相似。它適合的場合主要是:

(1)、須要時刻保證列表元素的有序排列;

(2)、須要頻繁的增刪和查詢操做;

(3)、屬於雙向迭代器,不能隨機訪問任意元素;

五、哈希桶

這個數據結構使用數組和鏈表來管理元素,在好的桶尺寸和哈希算法支持下,理想上能夠達到接近數組的隨機訪問效率。其適合的場合主要是:

(1)、不須要保證元素的順序(由於它是按哈希值決定插入到那個桶裏,與原始數據內容無關);

(2)、須要頻繁的增刪和查詢操做;

(3)、屬於單向或雙向迭代器(取決於具體實現),不能隨機訪問任意元素。

相關文章
相關標籤/搜索