考研复试-数据结构(2)

3. 散列表(用空间换时间的存储结构)

特点:

  1. 访问速度快
  2. 需要额外的空间:散列表一般是存不满的
  3. 无序
  4. 可能发生冲突

处理冲突的方法:

  1. 开放地址法:
    1. 线性探测法(容易导致元素聚集):删除元素时只能进行逻辑上的删除,不然会破坏整个散列表。
    2. 平方探测法
    3. 伪随机数法
  2. 再哈希法:把关键字用不同的哈希函数再做一次哈希,消耗时间
  3. 链地址法:
  4. 建立一个公共溢出区:当地址存在冲突时,把新的地址放在公共溢出区里。

应用:

  1. 缓存:对常用的信息做存储,以便快速找到
  2. 快速查找
  3. Office中写入错误单词会报错,因为在散列表中检测不到该单词
  4. 网站的缓存页面,利用散列表存入个人主页,当某个用户下次登录时,可以直接将页面反馈给用户。
  5. 信息安全领域中的加密算法

邻接矩阵和邻接表对比

  1. 无向图的邻接矩阵是对称的。矩阵中第i行或第j列的有效元素和就是该顶点的度。在有向图中,第i行有效元素的和就是该顶点的出度,第j行有效元素的和就是该顶点的入度。
  2. 邻接表中,无向图的同一条边存储两次,要求定点的度只需要求该顶点对应的单链表的结点个数即可。有向图某顶点的出度是该顶点对应单链表的节点个数,入度则要遍历其他顶点的链表。
  3. 邻接矩阵的优点是可以快速判断两个顶点的关系,快速添加边或删除边。缺点是若图的边较少,会浪费空间。邻接表的优点是节省空间,缺点是求顶点的度比较麻烦。

图的算法

  1. 图的遍历:深度优先搜索遍历DFS、广度优先搜索遍历BFS
  2. 单源最短路径问题:Dijkstra算法
  3. 拓扑排序:一个有向无环图的所有顶点的线性序列,通常用来排序具有依赖关系的任务,与广度优先搜索类似。
  4. 最小生成树:Kruskal算法(加边)、Prim算法(加点)

KMP算法:

在一个字符串中查找是否包含目标的匹配字符串,当发生不匹配的情况时,不是右移一位,而是移动(当前匹配的长度– 当前匹配子串的部分匹配值)位。

B树——平衡多路查找树

B树好处

B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方能大大提高热点数据的查询效率。

B+树好处

B+树的内部节点只存放键,不存放值。所以一次读取可以在内存页中获取更多的键,有利于更快地缩小查找范围。B+树的叶节点构成一条单链表,故当需要进行一次全数据遍历时,B+树只需要适用O(logn)的时间找到最小的一个节点,然后通过链表进行O(n)的顺序遍历即可。比b树快得多。

B树和B+树的区别:以m阶树为例

  1. 关键字的数量不同:B+树种的分支节点有m个关键字,有m个叶子结点,其关键字只起到索引作用。而B树有m个子节点,但只有m-1个关键字。
  2. 存储的位置不同:B+树中的数据都存储在叶子结点上,而B树的数据存储在每一个结点上。
  3. 分支结点的构造不同:B+树的分支节点仅存储关键字的信息和指向子节点的指针(这里的指针是磁盘块的偏移量),也就是说内部节点只包含索引信息。
  4. 查询不同:B树在找到具体的数值后便结束,而B+树的每一次搜索都要从根节点走到叶子结点。

查找

  1. 特定值查找:哈希表O(1)——问题:哈希表无序,不利于范围查找
  2. 范围查找:有序数组的二分法O(logn)——问题:不利于插入,删除
  3. 解决:二叉查找树:有序,便于插入删除,二分查找的思想——问题:不平衡,查找深度大
  4. 解决:平衡二叉树:基本满足——问题:磁盘I/O太频繁
  5. 解决:B树:一次I/O可以预读更多节点信息——问题:只能中序遍历查找,可能发生回溯
  6. 解决:B+树:支持中序遍历和顺序遍历,只有叶节点存储关键字信息,这样索引节点占内存变小,使得可搜索的范围更大,搜索的速度更快
posted @ 2021-03-07 11:34  平平无奇的打工人  阅读(165)  评论(0)    收藏  举报