博览网/boolan-STL与泛型编程-第3周笔记文章

1、hashtable

哈希表和数组、以及链表的对比:

(1).数组的特点:寻址容易,插入和删除困难; 数组存储连续,查找一个元素的时间复杂度为O(1);

(2).链表的特点:寻址困难,插入和删除容易。链表存储区是离散的,遍历链表的元素的时间复杂度为O(N)。

(3).hash-table是根据关键值(key-value)来直接进行访问的数据结构,它结合了数组和链表的优点。hash表的难点

  这里是一些联系人的信息,如果要存储这些信息你会怎么做?我们比较直观的想法是,设计一个结构体,用链表来存储。结构体里面包含一个char型数组存放名字,char字符串存放电话号码,和一个结构体指针用来存放下个结构体的地址。


  1. 张三 13980593357  
  2. 李四 15828662334  
  3. 王五 13409821234  
  4. 张帅 13890583472  

张三 13980593357
李四 15828662334
王五 13409821234
张帅 13890583472

当要查找”王五 15828662334“这条记录是否在这张链表中时,可能会从链表的头结点开始遍历,依次将每个结点中的姓名同”李四“进行比较,直到查找成功或者失败为止,这种做法的时间复杂度为O(n)。即使采用二叉排序树进行存储,也最多为O(logn)。假设能够通过”王五“这个信息直接获取到该记录在表中的存储位置,就能省掉中间关键字比较的这个环节,复杂度直接降到O(1)。Hash表就能够达到这样的效果。

Hash表采用一个映射函数 f : key —> address 将关键字映射到该记录在表中的存储位置,从而在想要查找该记录时,可以直接根据关键字和映射关系计算出该记录在表中的存储位置,通常情况下,这种映射关系称作为Hash函数,而通过Hash函数和关键字计算出来的存储位置(注意这里的存储位置只是表中的存储位置,并不是实际的物理地址)称作为Hash地址。比如上述例子中,假如联系人信息采用Hash表存储,则当想要找到“李四”的信息时,直接根据“李四”和Hash函数计算出Hash地址即可。


2、RB-tree

R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

注意
(01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
(02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。

红黑树示意图如下:

你可能感兴趣的:(博览网/boolan-STL与泛型编程-第3周笔记文章)