重溫《STL源碼剖析》筆記 第五章 樹

           源碼以前,了無祕密  ——侯傑html

  序列式容器                    關聯式容器         算法

  array(build in)                  RB-tree數據庫

  vector                        set數據結構

    heap                        mappost

      priority-queue                multisetui

  list                          multimapurl

  slist                       hashtablehtm

  deque                        hash_setblog

    stack(配接器)                   hash_map排序

    queue(配接器)                  hash_multiset

                             hash_multimap

 

第五章:關聯式容器

  定義:所謂關聯式容器,觀念上相似關聯式數據庫,每一個元素都有一個鍵值(能夠)和一個實值(value)

  關聯式容器沒有頭尾,只有最大元素和最小元素

  樹中根節點至任一節點的路徑長度,即所謂該節點的深度。而根節點的深度永遠是0,葉子節點的高度永遠

  也是0(可是又有版本《數據結構與算法分析--c語言描述》、《大話數據結構》中定義的根節點深度是1,

  葉子節點的高度也是1)。各執一詞,瞬間不淡定了。

  二叉搜索數,可提供對數時間的元素插入和訪問。二叉搜索樹的查找時很容易的,可是插入和移除麻煩

  點,若是刪除的節點有左右子節點,則將右子樹的最小節點取得須要刪除的節點。

  平衡二叉搜索樹:

    AVL Tree:任何節點的左右子樹高度相差最多1

    RB-tree(紅黑樹):一顆特殊的二叉搜索樹

      必須知足:1.每一個節點要麼是紅要麼是黑

           2.根節點必須是黑色的

             3.若是節點爲紅,其子節點必須爲黑

           4.任一節點至NULL(樹尾端)的任何路徑,所含之黑節點數必須相同。

    其餘關於樹和紅黑樹請查看另外一篇博客: 

  set:全部的元素都會根據元素的鍵值自動被排序,set元素的鍵值就是實值,實值就是鍵值。

    set不容許兩個元素有相同的鍵值。

    不能夠經過set的迭代器改變set的元素值,由於set的元素值就是其鍵值,關係到set

    元素的排序規則,若是任意改變set元素值,會嚴重破壞set組織。

    set以RB-tree爲底層機制,幾乎全部的set操做都只是轉調用RB-tree的操做行爲。

  map:

    map的全部元素都是pair,同時擁有實值和鍵值。pair的第一元素被視爲鍵值,第二元素被

    視爲實值。map也不容許兩個元素擁有相同的鍵值。

    map以RB-tree爲底層機制,幾乎全部的mapt操做都只是轉調用RB-tree的操做行爲。

  multiset:

    multiset的特性以及用法和set徹底相同,惟一的差異在於它容許鍵值重複,所以它的

    插入操做採用的是底層機制RB-tree的insert_equal()而非insert_unique()

  multimap: 

    multimap的特性以及用法和map徹底相同,惟一的差異在於它容許鍵值重複,所以它的

    插入操做採用的是底層機制RB-tree的insert_equal()而非insert_unique()

  hashtable

    二叉搜索樹具備對數時間的表現,但這樣的表現是基於一個輸入數據有足夠的隨機性。而

    hashtable(散列表)的數據結構,在插入,刪除,搜尋等操做上也具備常數平均時間的表現。

 

    使用hash function 會致使可能有不一樣的元素被映射到相同的位置(亦具備相同的索引)

    致使了碰撞問題。

    解決碰撞問題的方法有不少種:線性探測,二次探測,開鏈(STL使用)

  線性探測:容易致使主集團(primary clustering)的產生 (H+1,H+2,,,,H+i)

    對於碰撞通常採起的措施是若是計算出來的位置上已經有元素值了則

    循序往下一一尋找,直到沒有元素爲止。而進行元素搜尋時,若是計算出來的位置

    上的元素值與咱們的搜尋目標不符,就循序向下一一尋找,直到找到吻合值,或者

    直到趕上空格元素。而元素的刪除則必須採用惰性刪除,只標記刪除幾號,實際刪

    除操做則待表格從新整理時再進行。(主要是由於hash table中的每個元素不只

    表述它本身,也關係到其餘元素的安排。

  二次探測:(主要用來解決主集團的問題)(H+1^2,H+2^2,,,,H+i^2)

  表格負載:假設表格的大小爲質數,並且永遠保持負載係數在0.5一下(也就是說超過

      0.5就從新配置並從新整理表格),那麼就能夠肯定每插入一個新元素所須要的

      探測次數很少於2。

  表容量28個質數{5三、9七、19三、38九、76九、154三、307九、6151...}

    Hi=H0 + i^2(mod M)

    H(i-1)=H0 + (i - 1)^2(Mod M)

    整理可得:

    Hi=H(i-1) + 2i -1(Mod M)

  開鏈法:在每個表格元素中維護一個list;hash function 爲咱們分配某一個list

    而後在list上執行元素的插入,搜尋,刪除等操做。

    開鏈法的表格重建與否的判斷原則是:元素個數(包括新增元素)和bucket

    vector的大小來比。若是前者大於後者,就重建表格。

  

  hash_set:幾乎全部的操做行爲都是轉調用hasht_table的操做工做。

    RB-tree有自動排序功能而hashtable沒有,反應出來的結果就是,

    set的元素有自動排序功能而hash_set沒有。

  hash_map:  

    RB-tree有自動排序功能而hashtable沒有,反應出來的結果就是,

    set的元素有自動排序功能而hash_map沒有。

  hash_multiset:

    與multiset徹底相同,惟一的差異就是他的底層機制是hashtable,

    所以hash_multiset的元素不會自動排序。

    而hash_multiset與hash_set實現的惟一的差異在於,前者元素插入操做

    採用底層機制hashtable的insert_equal(),後者則是採用insert_unique()

  

  hash_multimap:

    與multimap徹底相同,惟一的差異就是他的底層機制是hashtable,

    所以hash_multimap的元素不會自動排序。

    而hash_multimap與hash_map實現的惟一的差異在於,前者元素插入操做

    採用底層機制hashtable的insert_equal(),後者則是採用insert_unique()

相關文章
相關標籤/搜索