数据结构复习

秋招加油


线性表

  • 顺序表 DataType data[MaxSize]; int length;

  • 链表 DataType date; Node * next;

操作:
查找: 按位查找、按值查找
插入 insert(int i, DataType x)
删除 Delete(int i)
遍历 PrintList()
求长度
链表
顺序表、链表比较:
顺序表:按位查找快,不需要扫描;需要预先分配一段连续的内存空间
链表:插入、删除不需要移动元素,元素可以分散在内存空间中

栈和队列

  • 栈:在表尾进行插入删除,后进先出,操作:pop(),push()
  • 队列:表头出列,表尾入列,先进先出,操作:enqueue(),dequeue()
    栈
    队列

模式匹配(Pattern Matching)

S:主串 T:模式串
朴素模式匹配(BF): 暴力解决,不匹配时,S 和 T 的下标都要回溯
KMP 算法:在匹配失败后,下标 i 不回溯,下表 j 回溯到某个位置 k。如何找到 k?
next[i]

遍历 前序(根左右) 中序(左根右) 后序(左右根) 层序(用队列)
Huffman 树:用于 huffman 编码,选取两个权值最小的结点合并为一个结点,加入结点集,重复,直至最后根结点。
编码:左右孩子,一方为 0,另一方为 1

遍历:深度优先(栈、递归) 广度优先(队列)
存储:邻接矩阵(存储稀疏图时浪费空间) 邻接表(查询是否时邻居的时候需要遍历)
最小生成树 MST

  • Prim 算法:两个点集 U,V,找链接两个点集不构成环的最小边,标记边的附着点
  • Kruskal 算法:给 edge 排序,一直选取不构成环的最小边,标记边的附着点

最短路径:

  • Dijikstra 单源点
    Dijkstra打表

选起点,打表+动态规划

  • Floyd 多源点 三重循环 for i… for j… for k… adj[i][j] = min{adj[i][j],
    adj[i][k]+ adj[k][j]}

拓扑排序(有向无环图)
统计入度,逐步删除入度为0的点和相应的边,重新统计入度
重复,直至点集为空
关键活动、关键路径:
最长的拓扑排序路径为关键路径(最短工期),关键路径上的点成为关键活动

查找

  • 顺序查找 O(n)
  • 折半查找 O(logn)
  • 二叉排序树:左子树的结点均小于等于根结点,右子树的结点均大于等于根结点。

插入删除
插入:找好位置直接插在叶子上
删除,分三种情况:

  1. 叶子直接删 2.只有一个子树,把父结点的指针指向这棵子树 3.左右子树都在,找到右子树的最左下结点(右子树里最小的),记为S,交换S和P的值,删除S

二叉排序树的搜索效率与树的形态有关
平衡二叉树AVL:
根结点的左右子树高度差为1
根结点的左右子树也都是二叉平衡树
构造平衡二叉树:边插入边调整,扁担原理
不平衡类型:LL型->右旋 RR型->左旋 LR型->先左旋再右旋 RL型->先右旋再左旋
AVL旋转
散列表:
通过散列函数H得出存储位置,便于随机查找
存在冲突,需要合适的方法处理冲突

排序

  • 插入排序->希尔排序

插入排序:将无须区的元素插入有序区
希尔排序:
排序记录序列按照间隔 d 拆分为若干个子序列
在子序列内分别进行插入排序
整个序列基本有序,再对全体记录进行一次插入排序
*分割:不是逐段分割,而是每隔 d 个记录的为一组(类似报数,喊 1 的为 1 组,喊 2 的为一组),组内用插入排序,
d=d/2,直到 d 为 1
相比插入排序,希尔排序可能会增加比较次数,但是减少了交换次数

  • 冒泡排序->快速排序

冒泡排序:
将记录划分为有序区和无序区
每次在无序区内两两对比并交换
当不发生交换时完全有序,停止冒泡
冒泡排序的缺点:只能交换相邻的两个记录
快速排序:
思路:选取一个轴中值,左侧元素均小于轴中值,右侧元素均大于轴中值
partition

  • 选择排序->堆排序

选择排序:在无序区选择最大(小)的元素放入有序区末尾
堆排序:改进选择排序,减少比较次数
堆:eg.小根堆(完全二叉树),每个结点的值都小于或等于左右孩子
操作:筛选 sift:e.g.大根堆. 将根结点与左右孩子的较大者对比,若根结点小于较大者,则与之交换。若有交换,还需要与孙结点比较…
步骤:1. 初始建堆:从最后一个结点开始 sift 2.将堆顶放入有序区(与无序区最后一个交换) 3.重建堆 循环,直至无
序区为空

  • 归并排序->桶排序(较为简单,略)

索引

索引
多路平衡查找树:

  • 2-3 树:
    每一个内部结点都有 1-2 个关键码,2-3 个子结点,所有的叶子都在同一层

  • m 阶 B 树:
    1.所有的叶子结点都在同一层
    2.若根结点不是终端结点,则至少又两个子树
    3.除根结点外所有的非终端至少有 ceil(m/2)棵子树
    4.每个结点至多有 m 棵子树

  • B+树:
    在 B 树的基础上: 结点关键字的个数和子树的个数相等 叶结点包含全部关键字以及指向相应记录的指针
    所有分支结点仅包含它的各个子结点的关键字的最大(小)值以及指向其子结点的指针
    叶子结点时前后相连的,可以进行从最小关键字开始的查找,而非树形查找
    B+树

  • 红黑树:

    红黑树和 2-3-4 树是等价的

    1. 红黑树是一个二叉查找树,每个结点时红色或者黑色
    2. 根结点是黑色
    3. 一个路径中没有两个连着的红色结点
    4. 红色结点与 2-3-4 树中的兄弟对应
    5. 黑色结点与 2-3-4 树中的子结点对应

可能的面试问题

  1. 简要说一下B树
  2. 简要说一下B+树
  3. 简要说一下红黑树
  4. 简要说一下快速排序,写一下快速排序

*复习整理,如有错误欢迎指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值