复试-数据结构

224 阅读8分钟

绪论

数据结构的定义

相互之间具有一种或多种特定关系的数据元素的集合

逻辑结构

数据元素之间的逻辑关系。

  1. 线性结构(顺序表)
  2. 非线性结构(树,图,集合)

物理结构

数据结构在计算机中的表示。

  1. 线性存储
  2. 链式存储
  3. 索引存储
  4. 散列存储

线性表

线性表的定义

具有相同数据类型的n个数据元素的有限序列

线性表的种类

  1. 数组
  2. 链表
  3. 队列

数组与链表的区别

  1. 存储结构
  2. 存取方式
  3. 增删改查
  4. 内存分配

给一个链表,如何确定有环

遍历链表,看尾指针是否指向头节点

链表逆置

头插法

单链表快速找到中间节点

双指针,一个一次2个节点,一个一次1个节点

头节点与头指针

  1. 头指针:指向链表第一个节点的指针
  2. 头节点:第一个元素节点之前的节点,便于各种操作

栈和队列

循环队列的栈满和栈空

  1. 牺牲一个节点
  2. 设置length
  3. 设置tag,表示上一次操作是插入还是删除

栈与队列的区别

  1. 栈只能从一端插入和删除
  2. 队列只能从一端插入,从另一端删除

为什么需要循环队列

利用循环数组,可以避免假溢出的情况。
假溢出:随着元素插入,指针到达被分配空间的最后一个节点,随着元素删除,头节点之前有空的空间。

树与二叉树

二叉树的定义

每个节点最多有两个子树,且两个子树之间有左右之分

二叉树的遍历

先序遍历:如果根节点不为空,输出根节点,先序遍历左子树,先序遍历右子树

树的存储结构

双亲表示法:链式存储 孩子表示法:邻接表 孩子兄弟表示法:链式存储

满二叉树

除了最后一层无任何节点外,其余层的所有节点都有两个子树

最小生成树

连通图的极小连通子图。可以使用Prim或者Kruskal算法

二叉树和节点只有两个孩子的树的区别

  1. 二叉树可以是空树,每个节点最多有两个子树,且子树有左右之分
  2. 只有两个孩子的树,子树没有顺序之分。

如何对树进行层序遍历

二叉排序树、平衡二叉树

  1. 二叉排序树,对于任意一个节点,满足该节点左子树的所有节点小于该节点,该节点右子树的所有节点大于该节点,且该节点的左右子树也为排序二叉树。
  2. 平衡二叉树,左右子树高度之差不超过1

二叉平衡树调整

一般有四种调整方法:

  1. LL:左节点的左子树插上新的节点,进行一次右旋
  2. RR:右节点的右子树插上新的节点,进行一次左旋
  3. LR:左节点的右子树插上新的节点,一次左旋,一次右旋
  4. RL:右节点的左子树插上新的节点,一次右旋,一次左旋

哈夫曼树及其作用

  1. 由n个带权叶子节点构成的所有二叉树中带权路径长度最短的二叉树。
  2. 哈夫曼编码

最优二叉树

哈夫曼树

构造huffman编码

  1. 统计字符出现频率
  2. 构造哈夫曼树
  3. 对哈夫曼树进行编码

二叉排序树如何增删

  1. 插入:若当前结点不为空,若要插入的值小于当前结点的值,则向左子树遍历,否则向右子树遍历。若当前结点为空,则将该值置于当前结点
  2. 删除:若删除的是叶子结点,直接删除。若删除的是非叶子结点,则用右子树的最左下角的结点 或者 左子树的最右下角的结点进行替换。

树和堆的区别

树是不包含回路的无向连通图。 堆是一种特殊的二叉树,双亲结点的关键字大于等于(或者小于等于)孩子结点。

图的定义

图是由边集和点集组成。

图的存储结构

邻接表、邻接矩阵、十字链表、邻接多重表

邻接矩阵如何存储

假设有N个结点,用NxN的矩阵表示图,第i行第j列的元素表示从第i个结点到第j个结点是否有边

图的遍历和树的遍历

图的遍历和树的遍历都是对其本身所有结点进行一次访问。 图的遍历:深度优先遍历,广度优先遍历 树的遍历:先序遍历,中序遍历,后续遍历

BFS和DFS的时间复杂度

用邻接矩阵都是O(n2)O(n^2),用邻接表都是O(V+N)O(|V|+|N|)

BFS和DFS的区别

BFS:队列,在开始其他节点之前,必须充分探究当前节点 DFS:栈,一旦发现为探索节点就会继续深入

N个节点的二叉树的最小生成树有几条边

N-1

最小生成树的两种算法

  1. prim,O(N2)O(N^2),适合稠密图,每次选取与当前生成树连接的最短的边
  2. kruskal,O(ElogE)O(ElogE),适合稀疏图,每次选择一条最短且不成环的边

dijkstra算法

每次从还未选择的节点中选择路径最短的节点,根据新加入的节点迭代到剩余节点的距离

Floyd算法

遍历每对节点,如果以某个节点作为中间节点能获得更短的最短路径,则更新该对节点的最短路径长度

Dijkstra和Floyd算法的不同

  1. Dijkstra算法:求解单源最短路径算法,贪心算法
  2. Floyd算法:求解每对顶点之间的最短路径问题,动态规划

强连通图和连通图的定义。非连通图怎么遍历

  1. 强连通图:有向图的任意两个顶点都连通
  2. 连通图:无向图的任意两个顶点都连通
  3. 非连通图的遍历:用遍历算法遍历所有的连通分量

什么图可以使用拓扑排序

有向无环图

n个节点的无向连通图最多和最少边数

最少n-1,最多(n-1)*n/2

什么是AOE网,什么是关键路径,什么是关键活动

  1. AOE网:Activity On Edge,用有向图的边表示活动的图
  2. 关键路径:从原点到汇点,具有最短路径长度的路径
  3. 关键活动:关键路径上的活动
  4. 关键路径存在条件:有向无环图

查找

二分查找

要求表中的元素升序排列,每次将待查找关键字与表中间位置的关键字进行比对。

  1. 如果相等,则中间位置就是待查找关键字的位置
  2. 如果小于中间位置的关键字,则在左边的子表中继续二分查找
  3. 否则在右边的子表中继续查找。
  4. 直到字表不存在

折半插入的高效方式

二叉平衡排序树

哈希表

  1. 定义:根据关键字而直接访问的数据结构。
  2. 特点:速度快,会产生冲突
  3. 构造哈希函数的方法:直接定址法,平方取中法,除留余数法
  4. 冲突:相同关键字被映射到同一个位置
  5. 解决冲突:开放定址法(二次聚集),链地址法(占用存储空间),再哈希法(提高计算量)

什么数据结构能够快速通过学号查找信息

哈希表

开放定址法删除元素

只能标记,不能真的删除,否则会引起查找错误

排序

快排

  1. 原理:每次选择一个枢轴变量,比枢轴变量小的放在左边,比枢轴变量大的放在右边,然后对左右子表也进行快速排序
  2. 时间复杂度:当成二叉树计算

怎么选择排序算法

  1. n小:插入排序
  2. n大:堆排序
  3. 基本有序:冒泡
  4. 快速排序

稳定排序

元素的大小相对位置不会因为排序而改变,在一些原本按照某些关键字排序的情况下有优势,比如在原本是按时间排序的基础上进行价格排序,不会出现价格相等而时间乱序的情况。

冒泡排序什么时候比较的次数最大

逆序

排序算法

选择排序
插入排序
冒泡排序
希尔排序:按照一定的下标增量分组,分组内使用插入排序
快速排序
堆排序