数据结构面试Q&A

Q:试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。

A:例如有一张学生基本信息表,主要包括学生的学号、姓名、性别、籍贯、专业等。每个学生基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列,对学生记录之间的这种关系就确定了学生表的逻辑结构,即线性结构。

这些学生记录在计算机中的存储表示就是存储结构。如果用连续的存储单元(如用数组表示)来存放这些记录,则称为顺序存储结构;如果存储单元不连续,而是随机存放各个记录,然后用指针进行链接,则称为链式存储结构。即相同的逻辑结构,可以对应不同的存储结构。

Q:数据结构三要素

A:逻辑结构、物理结构、数据运算

逻辑结构:线性逻辑结构,集合,树(1对多),图(多对多)

物理结构:顺序存储,链式存储,索引存储(索引表)和散列存储(hash函数,一一对应)

数据运算:运算的定义:运算功能的描述,是基于逻辑的,抽象的;运算的实现:完成运算的算法,是现实的基于存储的。

运算定义—>逻辑结构->存储结构->运算实现

Q:谈谈对于贪心算法的理解

A:寻找最优解的常用办法,把一般求解过程分为若个部分,每步都按照贪心原则,选取当下最好的情况。缺点:但往往得不到最优解

例子:找零钱问题,背包问题(value,weight,value/weight三种贪心策略)

Q:谈谈对动态规划的理解

A:动态规划其实就是,给定一个问题,我们把它拆成一个个子问题,直到子问题可以直接解决。然后呢,把子问题答案保存起来,以减少重复计算。再根据子问题答案反推,得出原问题解的一种方法。

关键在于,拆分子问题,记住过往,减少重复计算。

动态规划有几个典型特征,最优子结构、状态转移方程、边界、重叠子问题。例子:青蛙跳台阶问题(自底向上)

Q:谈谈对共享栈和两个栈组成的队列的理解

A:利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸,两个栈顶指针相邻的时候,判断栈满。

两个栈组成的队列,主要是设置一个栈s1为队尾负责入队,一个栈s2为对头,负责出栈。入队时若s1未满则直接入队,若已满但s2为空,则将s1全部移入s2,再入栈。出队时若s2有元素则直接出栈,若没有但s1有则将s1全部移入s2,然后再s2出栈。(移栈时一次全部移完)

Q:谈谈对搜索与回溯算法的理解

A:为了求得问题的解,先选择某一种可能的情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。

Q:KMP算法

A:KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。

Q:最小生成树算法

A:Prim算法kruskal算法。Prim算法其实就是说在当前顶点集所可以辐射到的边中选择最小的一条边(需要判断该边是否已经在最小生成树中),其实就是一个排序问题,然后贪心选取最小值,O(N^2)。Kruskal算法则是另外一种思维,从边开始,把所有的边按照权值先从小到大排列,接着按照顺序选取每条边(贪心思想),如果这条边的两个端点不属于同一集合,那么就将它们合并,直到所有的点都属于同一个集合为止,其实就是基于并查集的贪心算法O(n*logN);

Q:最短路径算法

A:Dijkstra,Floyd算法。DJ主要思想为每次在未确定的顶点中选取最短的路径,并把最短路径的顶点设为确定值,然后再由源点经该点出发来松弛其他顶点的路径的值,Floyd主要思想min(Dis(i,j),Dis(i,k)+Dis(k,j))来不断优化带权邻接矩阵

Q:拓扑排序

A:在AOV网中寻找一个没有前驱的顶点并输出,然后删除该顶点和所有以它为起点的有向边,循环直到没有顶点。

Q:谈谈对B树和B+树的理解和应用

A:B树即多路平衡查找树,一颗m阶B树或为空树或为满足如下特性的m叉树。

1. 若根结点不是终端结点,则至少有两颗子树,除根结点外的所有非叶结点至少有m/2(向上取整)颗子树,即至少含有m/2(向上取整)-1个关键字

2.B树的查找效率逼近二分查找

B+树大部分和B树类似主要区别为:

叶节点包含全部关键字,并将关键字按大小进行排序。

所有分支结点中仅包含他的各个子结点中关键字最大的值

应用:B树大量应用在数据库和文件系统当中,将相关数据尽量集中在一起,以便一次读取多个数据,减少硬盘操作次数。mysql使用B+树作为索引。

Q:谈谈对散列表(哈希表)的理解

A:根据关键字而直接进行访问的数据结构,也就是说建立了关键字和存储地址之间直接映射的关系。

主要就是有散列函数的构造方法,处理冲突的办法,查找效率等关键要素。

散列函数的构造方法主要有:直接定址法(线性)、数字分析法、平方取中法、折叠法(分割相加再取数)、除留余数法、随机数法等

处理冲突的办法有:线性探测法、平方探测法、再散列法、拉链法等

散列函数查找效率:散列函数、处理冲突的方法、装填因子

Q:常见排序及特性

A:直接插入法——>希尔排序(分组插入排序),冒泡排序——>快速排序(与基准比较,小的往前冒,大的往后冒),简单选择排序——>堆排序(利用维护堆来进行选择),归并排序(先拆分再合并),基数排序(基于关键字各位进行大小比较)

特性:

数据集较小时,可以采用直接插入和简单选择排序

若关键字已基本有序,可以选择冒泡和直接插入排序

若数据集较大则采用快排,堆排或归并排序

若n很大关键字位数较少可以采用基数排序

快排,希尔排序,简单选择排序,堆排序不稳定(快些选一堆),其他的稳定

Q:介绍一下线索二叉树的作用

A:将二叉树的空链域接入指针,根据二叉树的遍历方式左指针指向序列直接前驱结点,右指针指向序列直接后继结点,以加快查找结点前驱和后继的速度。

Q:图的存储结构

A:邻接矩阵法、邻接表法、十字链表有向图,邻接多重表无向图

Q:树的存储结构

A:双亲表示法(数组,记录双亲位置)、孩子表示法(链表记录孩子)、双亲孩子表示法

Q:堆与栈的区别

A:(1)栈由系统自动分配,而堆是人为申请开辟;

(2)栈获得的空间较小,而堆获得的空间较大;

(3)栈由系统自动分配,速度较快,而堆一般速度比较慢;

(4)栈是连续的空间,而堆是不连续的空间。

时间复杂度和空间复杂度:时间复杂度用来衡量一个程序运行的快慢,空间复杂度衡量一个算法运行所需要的额外空间。

递归与栈:递归过程分为两步“递”和“归”,对应着栈的两种操作“进栈”和“出栈”。应用:树的遍历,树的深度,树的前序,中序,后序,遍历都可以用栈实现,树的层序遍历用队列实现。

Class与struct的区别:class默认为private,struct默认为public,struct向下兼容,保存了很多c有关的操作

Q:哈夫曼树的理解与应用

A:哈夫曼树即最优二叉树(带权路径最短二叉树)(带权路径:权值*路径长度)

构造算法:

(1)根据n个给定的权值构成n棵二叉树的森林,森林中每一棵树只有一个带权的根结点(构造森林全是根)

(2)在森林中,选取两棵根结点的权值最小的树作为左右子树,构造一棵新的二叉树,且设置新的二叉树的根结点的权值为其左右子树上根结点的权值之和.(选用两小造新树)

(3)在森林中删除这两棵树,同时将新得到的二叉树加入到森林中.(删除两小添新人)

(4)重复(2)和(3),直到森林中只有一棵树为止,这棵树即为哈夫曼树.(重复2,3剩单根)

应用:

前缀编码:要设计长度不等的编码,则必须使任一字符的编码都不是另一个字符的编码的前缀。

哈夫曼编码:在哈夫曼树的每个分支上标上0或1:结点的左分支标0,右分支标1.把从根到每个叶子的路径上的标号连接起来,作为该叶子代表的字符的编码.

哈夫曼编码是最优前缀编码

Q:图的遍历算法

A:广度优先(BFS),深度优先(DFS)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值