1. 程式人生 > >常用資料結構的應用場景小結

常用資料結構的應用場景小結

1、單向連結

單向連結串列適用於只從一端單向訪問的場合,這種場合一般來說:

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

(2)、新增時,只直接新增到最後一個元素的後面或者新增到第一個元素的前面;

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

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

2、雙向連結串列

雙向連結串列相比單向連結串列,擁有前向和後向兩個指標地址,所以適合以下場合:

(1)、刪除時,可以刪除任意元素,而只需要極小的開銷;

(2)、新增時,當知道它的前一個或後一個位置的元素時,只需要極小的開銷。

(3)、屬於雙向迭代器,可以從頭走到尾或從尾走到頭,但同樣查詢時需要遍歷,效率與單向連結串列無改善,不適合大量查詢的場合。

這種典型的應用場景是各種不需要排序的資料列表管理。

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

這種資料結構使用一段連續的空間來存貯元素,所以可以直接通過索引來獲取到某個元素,而且可以通過對元素的內容進行排序,然後使用二分法查詢,從而提供查詢效率。其適合的場合主要是:

(1)、不會頻繁增刪元素的場合,因為增刪元素都牽涉到元素空間的重新分配,頻繁的記憶體分配操作會大幅降低操作效率。但新增操作時,可以通過預分配足夠的空間來優化新增時的效率。

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

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

這個資料結構類似於雙向連結串列,任意插入元素時都會自動排序,紅黑樹和平衡二叉樹都使二叉樹儘量平衡,從而使查詢時和二分法類似。它適合的場合主要是:

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

(2)、需要頻繁的增刪和查詢操作;

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

5、雜湊桶

這個資料結構使用陣列和連結串列來管理元素,在好的桶尺寸和雜湊演算法支援下,理想上可以達到接近陣列的隨機訪問效率。其適合的場合主要是:

(1)、不需要保證元素的順序(因為它是按雜湊值決定插入到那個桶裡,與原始資料內容無關);

(2)、需要頻繁的增刪和查詢操作;

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