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 ...