《STL原始碼剖析》讀書筆記 三

2021-08-21 14:52:52 字數 2285 閱讀 9888

hashtable(非標準)

二叉搜尋樹

任何節點最多只能允許兩個子節點

平衡二叉樹

確保整棵樹的深度為o(logn),左右子樹的高度最多差1

setmap

multiset

特性與用法與set完全相同,唯一的差別在於它允許鍵值重複,插入的時候用的是rb-tree的insert_equal()而不是insert_unique()

multimap

特性與用法與map完全相同,唯一的差別在於它允許鍵值重複,插入的時候用的是rb-tree的insert_equal()而不是insert_unique()

hash_table(雜湊表)

hash table可以提供所有的有名項的訪問操作和刪除操作,也可以視作是一種字典結構,意在提供常數時間的基本操作。

所有元素都是16bits且不帶正負號的整數,範圍為0-65535,那麼用乙個array來記錄,每個元素值代表相應元素出現的次數。如果i出現,那麼a[i]++。

解決雜湊函式出現的衝突問題

二次探測,依序嘗試h+1, h+4, h+9…h+i^2(可用位移法來計算)

用於消除主集團,卻可能造成次集團(可用double hashing來消除次集團)

開鏈法:**內的每個單元,涵蓋的不只是節點(元素),也可能是一「桶」節點。bucket維護的是乙個linked list。

sgi stl的hash table就是採用開鏈法

整個hash table是由vector和linked list組成。

# include

hashtable, identity, equal_to, alloc>iht(50, hash, equal_to());

iht.size()=0

iht.bucket_count()=53

用迭代器遍歷hashtable

hashtable, identity, equal_to, alloc>::iterator ite = iht.begin();

for(int i=0;icout

<<*ite<<' ';

cout

, identity, equal_to, alloc>::iterator ite = iht.begin();

for(int i=0;iint n = iht.elems_in_bucket(i);

if(n!=0){

cout

<<"bucket["

<"] has "

<" elems."

<

hash_map

hash_multiset

hash_multiset

hashmap的原理,內部資料結構

hashmap用的是hash_table,查詢時間複雜度為o(1).用vector來儲存每個桶,每個節點又是也用linked list來記錄。

hash_map,首先分配一大片記憶體,形成許多桶。是利用hash函式,對key進行對映到不同區域進行儲存。

什麼時候需要使用hash_map,什麼時候需要map?

總體來說,hash_map 查詢速度會比map快,而且查詢速度基本和資料資料量大小,屬於常數級別;而map的查詢速度是log(n)級別。並不一定常數就比log(n)小, hash還有hash函式的耗時,明白了吧,如果你考慮效率,特別是在元素達到一定數量級時,考慮考慮hash_map。但若你對記憶體使用特別嚴格,希望 程式盡可能少消耗記憶體,那麼一定要小心,hash_map可能會讓你陷入尷尬,特別是當你的hash_map物件特別多時,你就更無法控制了,而且 hash_map的構造速度較慢。

現在知道如何選擇了嗎?權衡三個因素:查詢速度, 資料量, 記憶體使用

hashmap 怎樣解決衝突,講一下擴容過程

hash table 用鏈式法來解決衝突。

拿元素個數與bucket_vector的大小來比較,如果前者大於後者,就進行重整。

要擴容的時候尋找下乙個質數。next_size()

設立新的bucket_vector

依序處理每個bucket所含的(序列)的每個節點

a. 找到這個節點位於哪個新的bucket buck_num(val, n)

b. 將bucket的指標指向下乙個節點

c. 將當前節點插入到新的bucket中,成為其對應序列的第乙個節點

d. 回到舊bucket所指的待處理的序列中,處理下乙個節點

對調兩個buckets. void swap (vector& x); 如果兩個vector的大小不同,那麼大的變小,小的變大

STL原始碼剖析讀書筆記

一.stl提供六大元件,彼此可以組合套用。1.容器 containers 各種儲存結構,如vector list deque set map,用來存放資料。2.演算法 algorithme 各種常用演算法,如sort search copy erase等。3.迭代器 iterators 扮演容器與演...

《STL原始碼剖析》讀書筆記 四

在stl中,所有的元素都是存放在容器中,容器需要配置空間來儲存這些數值,因此需要用到空間配置器。記憶體池 chunk alloc的工作 從記憶體池中取空間給free list使用。if 記憶體池水量足夠 直接調出20個區塊給free list else if 記憶體池水量還足夠提供至少1個區塊 調出...

STL原始碼剖析 讀書筆記(1)

stl即c 標準模板庫,主要由六大部件組成,分別是 分配器 容器 迭代器 演算法 仿函式 介面卡。在講述這些主要部件之前,先來了解一下物件導向程式設計和泛型程式設計,物件導向程式設計 object oriented programming,簡稱oop 企圖將資料和處理資料的方法放到一起,例如,在c ...