重温《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()

相关文章
相关标签/搜索