数据结构:知识点汇总(未完成)
1、用链表表示线性表的优点是(便于插入和删除操作)
2、单链表中,增加头结点的目的是(方便运算的实现)
3、栈和队列的共同特点是(只允许在端点处插入和删除元素)
4、栈通常采用的两种存储结构是(线性存储结构和链表存储结构)
5、队列具有(先进先出)的特征,栈具有(后进先出)的特征。
6、链表(插入和删除不需要移动元素,但是无法随机访问任一元素)
7、循环链表的主要优点是(从表中任一结点出发都能访问到整个链表)
8、线性表(除了第一个和最后一个元素外,其余每个元素都有一个直接前驱和直接后继)
9、线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构)
经验性的结论:
- 若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除时,宜采用单链表结构。
- 当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构,这样可以不需要考虑存储空间的大小问题。而如果事先知道线性表的大致长度,用顺序存储结构效率会高很多。
顺序表里面元素的地址是连续的,链表里面节点的地址不是连续的,是通过指针连起来的。
10、深度为5的满二叉树中,叶子结点的个数为(16,2k-1)。其共有(31,2n-1)个结点。设一棵完全二叉树共有699个结点。则该二叉树的叶子结点数为(350)个。#完全二叉树总的结点数为N,若N为奇数,则叶子结点数为(N+1)/2;若N为偶数,则叶子结点数为N/2。
11、具有3个结点的二叉树有(5)种形态。 #高度为2层的是:根-左-右。高度为3层的是:根-左-左、根-左-右、根-右-右、根-右-左。
记n个节点的二叉树形态个数为A[n]
1)0个节点的二叉树只有1种形态,A[0]=0;1个节点的二叉树只有1种形态,A[1]=1
2)n个节点(n>=2)的二叉树有 A[n] = ∑ [m=0到n-1] ( A[m]*A[n-m-1] ) ,求和的每一项,分别表示根的左子树为m个节点、右子树为 n-m-1个节点的情况,刚好就是catalan数,直接用catalan数的公式:h(n)=C(2n,n)/(n+1)
12、一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为(13)个。
#叶子结点数n0与度为2的结点数n2的关系是:n0=n2+1,所以度为2的结点个数为3-1=2。所以总的结点数为 n=n0+n1+n2, 8+2+3=13。
13、算法和数据结构的定义。
(1)算法是指(解决方案的准确而完整的描述)。
(2)算法由(顺序、选择、循环)控制结构组合而成。
(3)算法的时间复杂度是指(算法执行过程中所需要的基本运算次数)。
(4)算法的空间复杂度是指(执行过程中所需要的存储空间)。
(5)算法分析的目的是(分析算法的效率以求改进)。
(6)数据的存储结构是指(数据的逻辑结构在计算机中的表示)。
(7)数据的逻辑结构是指(反映数据元素之间逻辑关系的数据结构)。
(8)根据数据结构中各元素之间前后件关系的复杂程度,可将数据结构分为(线性结构和非线性结构)。
线性结构一般是首无前驱,尾无后继,中间元素有唯一的前驱和后继。主要有:列表、链表、队列、栈。非线性结构主要有:1、没有对应关系的 集合。2、一对多关系的 树。3、多对多关系的 图。
14、(队列,循环队列,顺序表)不具有记忆功能,(栈)具有记忆功能。
15、递归算法一般需要用(栈)来实现。 #在递归算法的运行过程中,需要利用栈来保存其运算结果、参数和返回地址等。
16、算法的五个基本特征是:
有限性:算法在执行有限步后必须终止。
确定性:算法的每个步骤都需要精确地定义,严格地、无歧义的运行。
输入:算法在运行之前赋给它的量。
输出:算法运行结束时的结果。
可行性:算法原则上能够精准地运行,而且人们用纸和笔做有限次运算后即可完成。
17、由两个栈共享一个存储空间的好处是(节省存储空间,降低上溢发生的概率)。
为了不发生上溢错误,就必须给每个栈分配一个足够大的存储空间。但实际中,很难准确地估计,若每个栈都分配过大的存储空间,势必造成系统空间紧张;若让多个栈共用一个足够大的连续存储空间,则可利用栈的动态特性使它们的存储空间互补
18、需要打印机输出数据时,一般将打印作业放在一个(队列)中。
19、非空的循环单链表head的尾结点(由 p 所指向) ,满足(p->next=head )。
20、与单链表相比,双向链表的优点是(更容易访问相邻结点)。
21、N个顶点的连通图中边的条数至少为(N-1)条。#将所有顶点连成一条线即可
22、N个顶点的强连通图中边的条数至少为(N)条。#将所有顶点连成一条圈
23、对长度为n的线性表进行顺序查找,最坏情况下需要比较(N)次。
24、最简单的交换排序是(冒泡排序)。
25、对长度为n的线性表进行顺序冒泡排序,最坏情况下需要比较(n(n-1)/2)次。
#一共比较n-1遍,第1遍需要比较n-1次,第1遍需要比较n-2次,........最后一遍需要比较1次。是一个等差序列,对其进行求和即可。
26、在序列基本有序的情况下,效率最高的方法是(A) #如果将插入排序换为冒泡排序,则选冒泡排序
A.插入排序 B.选择排序 C.快速排序 D.堆排序
插入排序通过数据元素的交换来逐步消除线性表中的逆序,所以比较的次数与初始排列次序有关,在待排序的元素序列基本有序的前提下,效率最高。而选择排序和堆排序的比较次数与初始排列次序无关。快速排序虽然与初始排列次序有关,但在待排序的元素序列基本有序的前提下,效率低于插入排序。
27、在下列几种排序方法中,要求内存量最大的是(D).
A.插入排序 B.选择排序 C.快速排序 D.归并排序
快速排序的基本思想是,通过一趟排序将待排序记录分割成独的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,再分别对这两部分记录继续进行排序,以达到整个序列有序;插入排序的基本操作是指将无序序列中的各元素依次插入到已经有序的线性表中,从而得到一个新的序列;选择排序的基本思想是:扫描整个线性表,从中选出最小的元素,将它交换到表的最前面(这是它应有的位置),然后对剩下的子表采用同样的方法,直到表空为止;归并排序是将两个或两个以上的有序表组成合成一个新的序列表。
28、希尔排序属于(插入类排序),堆排序属于(选择类排序)。
29、已知数据表 A中每个元素距其最终位置不远,为节省时间, 应采用(直接插入排序)。
30、数据结构是指相互有关联的( 数据元素 )的集合。
31、数据元素之间的任何关系都可以用 (前驱和后继) 关系来描述。
32、顺序存储方法是把逻辑上相邻的结点存储在 (物理位置) 相邻的存储单元中。
33、栈的基本运算有三种:入栈、退栈与读栈顶元素。
34、队列主要有两种基本运算:入队和退队。
35、在实际应用中,带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,这种带链的栈称为 (可利用栈) .
36、栈和队列通常采用的存储结构分别是 链式存储和顺序存储。
37、当循环队列非空且队尾指针等于对头指针时, 说明循环队列已满,不能进行入队运算。这种情况称为 (上溢)
38、当循环队列为空时, 不能进行退队运算, 这种情况称为 (下溢)。
39、在一个容量为 25 的循环队列中, 若头指针 front=16 , 尾指针 rear=9 , 则该循环队列中共有 18 个元素。 注: 当 rear<front 时, 元素个数=总容量-( front -rear ); 当 rear>front 时,元素个数= rear -front 。
40、判断一个链表是否存在环:https://blog.csdn.net/qq_34840129/article/details/80803169(python)| https://www.cnblogs.com/wxwhnu/p/11429099.html(C++)
单链表中元素的反转:https://blog.csdn.net/qq_34840129/article/details/80776363(python)| 反转链表后,输出新链表的表头。(C++) https://www.cnblogs.com/wxwhnu/p/11410085.html
判断两个数组中是否有相同的数字:https://blog.csdn.net/qq_34840129/article/details/80803894(python)| 两个链表的第一个公共结点(C++) https://www.cnblogs.com/wxwhnu/p/11421277.html
从一个子序列中找出其最大子序列的和:https://blog.csdn.net/qq_34840129/article/details/80810568(python)| https://www.cnblogs.com/wxwhnu/p/11415928.html (C++)
按单词反转字符串:https://blog.csdn.net/qq_34840129/article/details/80815806(python)| https://www.cnblogs.com/wxwhnu/p/11423010.html (C++)
删除数组中重复的元素:https://blog.csdn.net/qq_34840129/article/details/80811693(python)| https://www.cnblogs.com/wxwhnu/p/11425712.html (C++)
1、 数组和链表的区别
数组不允许动态地定义其大小,只能够将其定义成足够大小,这样可能会造成空间的浪费。
数组在内存中是顺序的存储,可以以O(1)时间查找元素,但是需要O(n)时间插入和删除元素(因为其后面的元素都需要跟着移动)。
链表可以动态地定义其大小。其在内存中是链式的存储,访问元素是需要从头开始向后顺序访问,所以需要O(n)时间查找元素;如果在所需位置直接插入或删除元素,需要O(1)时间,如果在需要先找到所需位置再插入或删除元素,需要O(n)时间。
2、链表的基本操作:反转,是否存在环,循环链表(https://blog.csdn.net/qq_34840129/article/details/80598418)和双向链表(https://blog.csdn.net/qq_34840129/article/details/80601053)的查找、插入、删除操作。
3、栈的入栈和出栈:https://blog.csdn.net/qq_34840129/article/details/80605936,队列的入队和出队:https://blog.csdn.net/qq_34840129/article/details/80615388
4、二叉树的基础知识:https://blog.csdn.net/qq_34840129/article/details/80624564 及其三种遍历(递归和非递归实现):https://blog.csdn.net/qq_34840129/article/details/80619761
5、图的基础知识:https://blog.csdn.net/qq_34840129/article/details/80649295
6、常用散列函数和冲突消解机制:https://blog.csdn.net/qq_34840129/article/details/80703304
7、排序算法中基本的冒泡排序、选择排序、插入排序需要很快地用代码实现。堆排序、归并排序、快速排序需要掌握其主要思想,并熟悉常用排序算法的时间和空间复杂度,及其应用范围:
(1) 当数据规模较小时,直接采用直接插入排序或直接选择排序。
(2) 当数据已经基本有序时,可以用直接插入排序或冒泡排序。
(3) 当数据规模较大时,可以用快速排序。当记录随机分布时,快速排序的平均时间最短。当最坏情况时,其时间复杂度为O(n2),空间复杂度为O(n)。
(4) 堆排序所需的辅助空间比快排少,但这两种方法都不稳定。
(5) 归并排序既可以用于内部排序,也可以用于外部排序,是一种稳定的算法。
参考资料
https://blog.csdn.net/qq_34840129/article/details/80781829
https://www.cnblogs.com/ksWorld/p/7537157.html
https://www.nowcoder.com/questionTerminal/fd339973a0544378a6f8110c7f18dd76?from=14pdf