数据结构知识点复习

1、数组和链表的区别:

数组的特点:

  1. 数组在内存中是连续的区域
  2. 数组的大小需要提前申请,即需要提前确定大小。不利于扩展,可能导致用不完而浪费
  3. 数组数据的插入删除,需要移动后面的数据,效率低
  4. 数组读取是随机的,可以通过下表随机读取,效率高
  5. 存储密度为1

链表的特点:

  1. 链表在内存中不要求空间,可以是任何地方,可以断断续续的。
  2. 增加和删除数据很容易,只需要改变添加位置的前后两个数据单位的指针就行
  3. 查找数据是顺序的,效率低
  4. 链表的大小可以不指定,方便扩展
  5. 存储密度<1(因为结点中有指针域)

数组的优点:随机访问,查找效率高

缺点:插入和删除效率低、可能造成内存浪费、内存必须是连续、数组大小要提前固定,不能动态扩展

链表的优点:插入删除速度快、内存利用率高,大小易扩展

缺点:查找效率低

 

2、简述快速排序的过程

  1. 选择一个基准元素,通常选择第一个或者最后一个;
  2. 通过一趟将待排序的记录分成独立的两部分,其中一部分比基准值小,一部分比基准值大。基准值已经排好在正确位置;
  3. 然后分别对两部分为排序记录用同样的方法进行排序,直到整个序列有序。

 

3、邻接矩阵与邻接表的:

邻接矩阵:用一个二维数组存放顶点间关系(边或弧),无向图为两点间是否有连线可达,有向图是两点间是否有到达方向的连线。

邻接表:图中顶点用一个一维数组存储,图中每个顶点vi的所有邻接点构成单链表

对比:

  1. 在邻接矩阵中,无向图的邻接矩阵是对称的。矩阵中的第i行或第i列有效元素个数之和就是顶点的度;

在有向图中第i行有效元素个数和是顶点的出度,第i列有效元素个数之和是顶点的入度。

  1. 在邻接表的表示中,无向图的同一条边在邻接表中存储的两次。如果想要知道顶点的度,只需要求出所对应链表的结点个数即可。

有向图中每条边在邻接表中只出现一次,求顶点的出度只需要遍历所对应链表即可。求入度则需要遍历其他顶点的链表。

(3)邻接矩阵与邻接表优缺点:

邻接矩阵的优点是可以快速判断两个顶点之间是否存在边,可以快速添加边或者删除边。而其缺点是如果顶点之间的边比较少,会比较浪费空间。因为是一个 n∗n 的矩阵。

而邻接表的优点是节省空间,只存储实际存在的边。其缺点是关注顶点的度时,就可能需要遍历一个链表。

4、KMP算法:

在一个字符串中查找是否包含目标的匹配字符串。其主要思想是每趟比较过程让字串先后滑动一个合适的位置,当发生不匹配的情况时,不是右移一位,而是移动(当前匹配的长度– 当前匹配子串的部分匹配值)位。

 

 

5、栈和队列的共同特点是:只允许在端点处插入和删除元素

6、栈通常采用线性存储结构和链表存储结构

7、在单链表中增加头结点的目的是:方便运算的实现

8、设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总共的结点数?

       叶子结点数=双分支结点数+1

       所以总结点数为3+8+(3-1)=13

9、已知二叉树后续遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是:(cedba)

       (1)首先找根节点:后续的最后一个

       (2)然后找左右分支:根据中序

       (3)对左右分支循环使用上述方法

10、下列数据结构中具有记忆功能的是:C

       A.队列    B.循环队列    C 栈    D 顺序表

       解析:具有记忆功能的数据结构是栈,原因很简单:后进栈的先出栈,所以你对一个栈进行出栈操作,出来的元素肯定是你最后存入栈中的元素,所以栈有记忆功能。

11、递归算法一般使用的数据结构是:栈

       解析:递归的过程就是压栈的过程,先把数据压进栈,递归结束时,再出栈。

 

12、简述直接插入排序算法

       (1)选择原始序列中的第一个数,作为有序数列

       (2)每次向后选取一个数据,插到已经有序的数列中的合适位置,查找位置的方法是顺序查找

       (3)不断重复第二步

 

13、折半插入排序

       插入的基本思想和直接插入排序类似,只是插入位置采用折半查找法

 

14、希尔排序

       希尔排序又称作缩小增量排序,本质还是插入排序:将待排序列按照选取得增量分成几个子序列分别对这几个子序列进行直接插入排序。

       注意:(1)增量序列的最后一个值一定是1

               (2)增量序列的值应尽量没有除1之外的公因子

15、冒泡排序结束条件是一趟排序过程中没有发生关键字的交换

16、简单选择排序:

       从头至尾顺序扫描序列,找出其中最小的关键字,和第一个关键字交换,接着从剩下的关键字中继续这种选择和交换,直至最终序列有序

17、堆排序:

       (1)什么是堆?

       堆可以看成一棵完全二叉树,这棵二叉树满足:任何一个非叶子结点的值都不大于(或不小于)其左右孩子结点的值。若父亲大孩子小,称为大顶堆;若父亲小孩子大,则称为小顶堆。

       (2)堆排序的思想:

       堆排序就是将序列调整为推,根据堆中根节点的值是最大(或是最小),就可以找到这个序列的最大值(或最小值),然后将找出的这个值交换到序列的最后(或最前),这样有序关键字增加1个,无序关键字减少1个,对新的无序序列重复这样的操作,就可以实现排序。

 

18、归并排序:

       归并排序可以看作一个分为治之的过程:先将整个序列分成两半,对每一半分别进行归并排序,得到两个有序序列,然后将这两个有序序列归并成一个序列即可。

 

19、基数排序

       基数排序的思想是“多关键字排序”,分成两种:

  1. 最高位优先

即先按最高位拍成若干序列,再对每个子序列按次高位排序

  1. 最低为优先

不必分成子序列,粉刺排序全体关键字都参与。最低位优先进行,不通过比较,而是通过“分配”和收集

 

20、查找法

       (1)顺序查找法:

从表的一端开始,顺序扫描线性表,依次将扫描的关键字与给定值k比较,若当前扫描的关键字与k相等,则查找成功;若扫描结束后,仍未发现关键字等于k的记录,则查找失败。

  1. 折半查找

折半查找首先限定线性表是有序的,然后与线性表的中间位置的关键字比较,如果大于则再在线性表右边比较,反之在左边比较。直到子区间小于1

 

21、分块查找

       分块查找又称为索引顺序查找:分块查找把线性表分成若干个块,每一块中的元素存储顺序是任意的,但是块与块之间必须按照关键字大小有序排列,即前一块中的最大值关键字小于后一块最小值关键字。

 

22、二叉排序树

       二叉排序树或者为空树,或者是满足一下性质的二叉树:

  1. 若它的左子树不空,则左子树上的所有关键字的值均小于根关键字的值
  2. 若它的右子树不空,则右子树上的所有关键字的值均大于根关键字的值
  3. 左右子树又分别是二叉排序树

 

 

23、平衡二叉树(AVL树)

       以树中所有结点为根的左右子树高度之差的绝对值不超过1的二叉排序树。

 

24、B树

B树是平衡m叉查找树,但是限制更强,要求所有叶子结点在同一层。且节点数等于关键字数加1

       性质:下层结点内的关键字取值总是落在由上层结点关键字所划分的区间内。

 

25、B+树

       (1)n个关键字的结点含有n个分支(对应B树n个关键字含有n+1个分支)

       (2)B+树中叶子结点包含信息,并且包含全部关键字,叶子结点引出的指针指向记录

       (3)B+树中非叶子结点仅起到索引的作用,不含有该关键字对用的记录的存储地址(B树每个关键字对应一个记录的存储地址)

 

26、赫夫曼树

       赫夫曼树又叫作最优二叉树,特点是带权路径最短

       构造赫夫曼树的方法:

  1. 首先选择其中最小权值的两点,构造一棵树
  2. 将新生成的树的根节点和剩余的结点间,在选择两个最小权值组成一棵树
  3. 重复上述步骤,直到只剩下最后一棵树为止,这棵树就是赫夫曼树

 

27、深度优先搜索遍历

       基本思想:首先访问出发点v,并将其标记为已访问过,然后选取与v邻接的未被访问的任意一个顶点w,并访问它;再选取与w邻接的未被访问的任一顶点并访问,以此重复进行。当一个顶点所有的邻接顶点都被访问过时,则依次退回到最近被访问过的顶点,若该顶点还有其他临近顶点未被访问,则从这些未被访问的顶点中取一个并重复访问过程。

 

28、广度优先搜索遍历

       基本思想:首先访问起始顶点v,然后选取与v邻接的全部顶点w1,……,wn进行访问,再依次访问与w1,……,wn邻接的全部顶点(已经访问过的除外),依次类推直到所有顶点都被访问过为止。

 

29、最小生成树

       (1)普里姆算法

算法思想:从图中任意取出一个顶点,把它当成一棵树,然后从与这棵树相接的边中选取一个最短(权值最小)的边,并将这条边及其所连接的顶点也并入这棵树中,此时得到一棵有两个顶点的树,然后从与这棵树相接的边中选取一条最短的边,并将这条边及其所连顶点并入当前树中,得到一棵有3个顶点的树。以此类推,直到图中所有顶点都并入树中为止,此时得到的生成树就是最小生成树。

(2)克鲁斯卡尔算法

算法思想:将图中边按照从小到大排序,然后从最小边开始扫描各边,并检测当前边是否为候选边,即是否该边的并入会构成回路,如果不构成回路,则将该边并入当前树中,直到所有边都被检测完为止。

 

30、最短路径:

       (1)迪杰斯特拉算法(求图中某一顶点到其余各顶点的最短路径

              算法思想:设有两个顶点集合S和T,集合S中存放图中已找到最短路径的顶点,集合T中存放图中剩余顶点。初始状态时,集合S中只包含源点v0,然后不断从集合T中选取到顶点v0路径长度最短的顶点vu并入到集合S中。集合每并入一个新的顶点vu,都要修改顶点v0到集合T中顶点的最短路径长度值。不断重复此过程,直到集合T的顶点全部并入到S中为止。

       (2)弗洛伊德算法(求图中任意一对顶点间的最短路径)

              算法思想:过程略

 

31、AOV网(Activity on Vertex network 活动在顶点上的网)

       一种可以形象地反应出整个工程中各个活动之间的先后关系的有向图:以顶点表示活动、以边表示活动的先后次序且没有回路的有向图。

 

32、拓扑排序核心算法

       对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若存在u到v的路径,则拓扑排序序列中一定是u出现在v的前边。

       操作步骤如下:

  1. 从有向图中选择一个没有前驱(入度为0)的顶点输出;
  2. 删除1)中的顶点,并且删除从该顶点出发的全部边;
  3. 重复上述两步,直到剩余的图中不存在没有前驱的顶点为止。

 

33、AOE网(Activity on Edge network)

       对比AOV网:

       两者的共同点:都是有向无环图

       两者的不同点:AOE网的边表示活动,边有权值,边代表活动持续的时间;顶点表示事件,事件是图中新活动开始或者旧活动结束的标志。AOV网顶点表示活动,边无权值,边代表活动之间的先后关系。

 

34、关键路径核心算法

       关键路径:在AOE网中,从源点到汇点的所有路径中,具有最大路径长度的路径称为关键路径。

       完成整个工程最短时间就是关键路径长度所代表的时间。关键路径上的活动称为关键活动。

       关键路径既代表了一个最短又代表了一个最长:

       因为一个任务完成所花费的时间取决于其中最耗时得那一部分,而最耗时的那一部分就是完成这个任务的最短时间。

 

35、解决哈希冲突的方法:

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。

哈希冲突:就是根据key即经过一个函数f(key)得到的结果的作为地址去存放当前的key value键值对(这个是hashmap的存值方式),但是却发现算出来的地址上已经有人先来了。就是说这个地方要挤一挤啦。这就是所谓的hash冲突啦

  1. 开放定址法
  1. 线性探测法
  2. 平方探测法
  3. 伪随机序列法
  4. 拉链法

 

参考文章:

 

https://blog.csdn.net/qq_25806863/article/details/70607204

https://www.cnblogs.com/yuxiaoba/p/8646169.html

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值