第十章 2-3-4树和外部存储

在二叉树当中,每个节点都有一个数据项,最多有两个子节点.如果允许每个节点可以有更多的数据项和更多的子节点,那么就是多叉树

1.2-3-4树的介绍

2,3,4名字的含义是指一个节点可能含有的子节点的个数,对于非叶子结点有三种可能的情况

  • 1.1 有一个数据项的节点总是有两个子节点
  • 1.2 有两个数据项的节点总是有三个子节点
  • 1.3 有三个数据项的节点重视有四个子节点
  • 1.4 搜索2-3-4树:本质和二叉树的搜索流程是一样的

2.2-3-4树转变为红-黑树

  • 2.1 把2-3-4树中的每个2-节点转化成为红-黑树的黑色节点
  • 2.2 把每个3-节点转化成一个子节点和一个父节点,哪个节点变成了子节点或者父节点都无所谓,子节点涂成红色,父节点涂成黑色

3.小结

  • 3.1 多叉树比二叉树又更多的管家in自和子节点
  • 3.2 2-3-4树是多叉树,每个节点最多有三个关键字和4个子节点
  • 3.3 多叉树中,节点中数据项按照关键字升序排列
  • 3.4 分裂根需要创建两个新节点,分裂出另一个节点,创建出一个新的节点
  • 3.5 只有分裂根时2-3-4树的高度才会增长
  • 3.6 2-3-4树和红黑树之间存在一对一的对应关系
  • 3.7 2-3-4树当中分裂节点和在红黑树中进行颜色变幻时一样的
  • 3.8 2-3-4树的高度是log2N
  • 3.9 查找的时间和高度成正比
  • 3.10 2-3-4树很浪费空间,因为很多节点还不满一半
  • 3.11 外部储存的意思是在主存外面保存数据,通常是在磁盘上
  • 3.12 外部储存器比主存大,便宜,但是比较慢
  • 3.13 外部存储器中的数据通常需要在 主存间来回传送,一次传送一块
  • 3.14 在外部存储器当中的数据可以按照关键字顺序有序品牌咧.这样查找很快,但是插入或者删除就会变得很慢.总的来说凡是有序的东西查找都会比较快,但是插入或者删除后依旧要保持它原本的顺序,自然就会变得很慢
  • 3.15 B-tree是多叉树,每个节点可以有几十或上百个关键字和子节点
  • 3.16 B-tree中子节点的个数总是比关键字的个数多1

第十一章 哈希表

哈希表存在的优点,插入和查询非常的快,但是当数据量达到饱和值的时候,速度回下降的非常多,就是需要去重建hash表的reset的计算表当中的数据的值,

1.哈希化

哈希化最重要的就是把关键字转换成为数组的下表,在哈希表当中有着每个字符对应的一个哈希表的数字

2.小结

  • 2.1 哈希表基于数组
  • 2.2 关键字值得范围通常比数组容量大
  • 2.3 关键字值通过哈希函数映射为数组的下标
  • 2.4 英文字典是一个数据库的典型例子,他可以有效的用哈希表来处理
  • 2.5 一个关键字哈希化到已占用的数组单元,这种情况叫做冲突
  • 2.6 开放地址法用于解决哈希冲突,分别包括三种方法
    • 2.6.1 线性探索:简单来说就是如果检测到这个关键字已经被hash化到表当中的5422这个位置,那么它就会找到下一个位置5423,以此类推
    • 2.6.2 二次探测:线性探测中会发生聚集.一旦聚集形成,它会变得越来越大,那些哈希化后的落在聚集范围内的数据项,都要一步一步移动,并且插在聚集的最后,因此使聚集变得更大.聚集越大,它增长得也会越快.二次探索消除了线性探测当中的聚集问题,这种问题称之为原始聚集,然而,二次探索又会产生另一种更细的聚集问题,这种问题称之为二次聚集
    • 2.6.3 再哈希法:可以消除和解决原始聚集和二次聚集的问题
  • 2.7 链地址法:在开放地址法当中,通过哈希表中再去寻找一个空位解决冲突问题,另一个方法是在哈希表的每个单元中设置链表.某个数据项的关键字值还是像通常一样映射到哈希表的单元中,而数据项本身插入到这个单元的链表中,其他同样映射到这个位置的数据项只需要加到链表当中,不需要在原始数组当中寻找空位
  • 2.8 哈希冲突可以通过两种方法来解决,开放地址法和链地址法
  • 2.9 在开放地址法中,把冲突的数据项放在数组的其他位置
  • 2.10 在连地址法当中,每个数组单元包含了一个链表.把所有映射到同一个数组下标的数据项都插在这个链表当中
  • 2.11 三种开放地址法:线性探测,二次探测,再哈希法
  • 2.12 在线性探测当中,已填充单元的长度不断增加.他们叫做首次聚集,这会降低哈希表的性能
  • 2.13 二次探测消除了首次聚集,但是产生了二次聚集,它比首次聚集的危害略小
  • 2.14 二次聚集的发生时因为所有映射到同一个单元的关键字,在探测过程中能够执行了相同额序列
  • 2.15 发生上述的情况主要是因为步长只依赖于哈希值,与关键字无关
  • 2.16 在再哈希法当中,步长依赖于关键字,而且从第二个哈希函数中得到
  • 2.17 在再哈希法中,如果第二个哈希函数返回一个值S,那么探测序列就是x,x+s,x+2s,x+3s,x+4s,以此类推,这里的s由三个关键字得到,但是在探测过程中保持常量
  • 2.18 装填因子也是java当中集合的加载因子,它是等于数据项数除以数组容量
  • 2.19 开放地址法当中最大的装填因子在0.5附近,若具有相同的装填因子,对于再哈希法来说,查找平均探测长度是2
  • 2.20 在开放地址法当中,当装填因子接近1时,也就意味着每次都等到数据项满了之后再进行拓展容量,再进行查找,这样的时间消耗非常大,该时间趋近于无限大
  • 2.21 开放地址法中,关键是哈希表不能装填的太满了
  • 2.22 对于链地址法,装填因子为1比较合适,它相当于是再创建出一个链表用于储存哈希冲突的值,所以可以解决线性探测和二次探测在原有的哈希表上消耗的性能
  • 2.23 链地址法的探测长度随着装填因子的变大而线性增长

第十二章 堆

堆是一种特殊的优先级队列,堆的本质是一种树,由树来进行实现优先级的插入和删除的时间复杂度都是O(logN),尽管这样删除的时间变慢了一些,但是插入时间快得多了

备注:这里的堆并不是Java或者C++党章的堆,后者是程序员用new 能得到哦的计算机内存的可用部分

1.堆的特点

  • 1.1 它是完全二叉树.这也就是说,除了树的最后一层及诶单不需要是满的,其他的每一层从左到右都完全是满的
  • 1.2 它常常用一个数组实现
  • 1.3 堆当中的每一个节点都满足堆的条件,也就是说每个节点的关键字都大于或等于这个节点的子节点的关键字
  • 1.4 堆数据结构逇效率使得它引出了一种出奇简单,并且很有效率的算法,称为堆排序

2.小结

  • 2.1 堆是优先级队列ADT的有效实现形式
  • 2.2 每个节点的关键字都小于它的父节点,大于它的子节点
  • 2.3 要插入的数据项总是先被存放到数组第一个空的单元当中,然后再向上筛选它至适当的位置
  • 2.4 当从根移除一个数据项时,用数组当中最后一个数据项取代他的位置,然后再向下筛选这个节点至适当的位置
  • 2.5 向上筛选和向下筛选可以被看做一系列的交换,但是更有效的作法是进行一系列复制
  • 2.6 可以更改任何一个数据项的优先级.首先,更改它的关键字,如果关键字增加了,数据项就向上筛选,而如果关键字小了,数据项就向下筛选
  • 2.7 堆的实现可以基于二叉树,它映射堆的结构,称为树堆
  • 2.8 存在在树堆中查找最后一个节点或者第一个空的单元的算法
  • 2.9 在概念上堆排序的过程包括先在堆中插入N次,然后再做N次转移

第十三章 图

图是一种与树有些相像的数据结构,实际上从数学意义上来说,树是图的一种,然而,在计算机程序设计当中,图的应用方式与树不同

1.小结

  • 1.1 图可以表示许多真实世界的情况,包括飞机航线,电子线路和工作调度
  • 1.2 两个主要的搜索算法是深度优先搜索(DFS)和广度优先搜索(BFS)
  • 1.3 深度优先搜索通过栈实现,广度优先搜索通过队列实现

第十四章 带权图

带权图解决最短路径问题,例如现实生活中的铁路线问题

带权图的效率问题,迄今为止,还没有讨论各种图的算法的效率,由于图的表示法有两种,邻接矩阵和邻接表,使得这个问题变得相对复杂

1.小结

  • 1.1 带权图中,边带有一个数字,叫做权,它可能代表距离,耗费,时间或者其他意义
  • 1.2 带权图的最小生成树中所有的顶点和连接他们的必要的边,且这些边的权值最小
  • 1.3 优先级队列的算法可用于寻找带权图的最小生成树
  • 1.4 带权图的最小生成树模拟了真实世界的许多情况,例如在两个城市之间铺设线缆
  • 1.5 无权图的最短路径问题要找到两点之间的路径,且路径长度最短