資料結構與演算法(1)- 資料結構概覽
宣告:雖然本系列部落格與具體的程式語言無關。但是本文作者對c++相對比較熟悉,其次是java,所以難免會有視角上的偏差。舉例也大多是和這兩門語言相關。
今天先來看看有哪些常見的資料結構(C++ STL視角,其他應該也大同小異吧。哈哈,我猜的!)。所以之後的內容大多從STL出發,然後順便對比下java中對應的資料結構。作為一名合格的軟體開發人員,我們有時不需要深入對這些結構進行深度瞭解(原子級瞭解),但是至少我們得知道這些結構的基本原理、構成以及代價(時間空間代價)。如果你想對這些結構深度瞭解,建議閱讀《STL原始碼剖析》這本書,java的話可以直接讀相關的原始碼就行了。這個系列部落格只會分析這些結構的基本原理、代價以及應用時注意的細節,而不會用程式碼實現。那麼廢話不多說,先來個表:
序列容器 | 關聯容器 |
vector | RB_tree |
list | set |
deque | map |
stack | multiset |
queue | multimap |
heap | hashtable |
priority_queue | hash_set |
slist | hash_map |
hash_multiset | |
hash_multimap |
C++ STL裡將上表出現的這些重要的資料結構稱為容器。容器也就是裝東西之物,資料結構乃是裝資料之物。這麼理解資料結構其實很簡單。說白了資料結構就是構造了一塊空間,然後制定了/構造了一些規則來更方便的管理和操作這些資料。那麼根據“資料在容器中的排列”特性,這些資料結構可以分為序列式(sequence)和關聯式(associative)兩種。
所謂序列式容器,其中的元素都可序(ordered),但未必有序(sorted)。 --侯捷
所謂關聯式容器,觀念上類似關聯式資料庫(實際上則簡單許多):每筆資料(每個元素)都有一個鍵值(key)和一個實值(value)。 --侯捷
所以這下子我們就清楚啦,表1左側的資料都是可序的,右側的資料資料都是由鍵值對構成的。那麼他們到底有啥區別呢,又有什麼效能上的差異呢,空間佔用又是啥情況呢?這些問題就隨著我們的部落格一步一步來揭開咯。
小祕密:下一篇將講解序列容器中的vector。另外可以透漏個小祕密,根據資料組織的不同序列式容器大致可以分為三種哦!一是基於陣列的,一是基於列表,再是基於樹結構的喲。
See you next time. Happy Coding!!!
我的GitHub