刷题总结 1.25 1.26(有没看懂的题)

刷题总结 1.25 1.26(有没看懂的题)_第1张图片

非空广义表的第一个元素称为表头,他可以是一个单元素,也可以是一个子表;所以选D。

广义表(Generalized List)是一种数据结构,它可以用于表示多层次的、具有递归结构的数据。广义表可以包含数据项和子广义表,数据项可以是任意类型的数据,而子广义表则是一个嵌套的广义表。

广义表可以用于表示复杂的数据结构,例如树、图等。它可以提供一种灵活、递归的方式来组织和处理数据。在编程语言中,广义表通常作为一种数据类型或抽象数据类型来实现。

广义表(Generalized List)是一种扩展了线性链表(linked list)的数据结构,它可以包含其他广义表或者元素。广义表可以包括以下部分:

  1. 原子元素(Atom):原子是广义表中的基本元素,可以是任意类型的数据,如整数、浮点数、字符等。

  2. 空表(Empty List):空表表示一个没有任何元素的广义表,可以用空集合符号“∅”或者空括号“()”表示。

  3. 列表(List):列表是广义表的基本组成部分,它可以包含原子元素或者其他列表。列表由一对括号“()”包围,其中元素之间用逗号“,”分隔。例如,(1, 2, 3) 是一个包含三个整数元素的列表。

  4. 嵌套列表(Nested List):广义表可以嵌套包含其他广义表,形成嵌套列表的数据结构。嵌套列表可以是任意层次的,也可以包含不同层次的嵌套。例如,((1, 2), (3, 4)) 是一个包含两个嵌套列表的广义表。

广义表的扩展性使其成为一种灵活的数据结构,可以用来表示复杂的数据关系,适用于各种领域的编程问题。

广义表通过使用两个特殊的符号来表示:逗号(,)用于分隔不同的数据项,而括号()用于标识子广义表的开始和结束。

拓展:除表头元素之外,由其余元素所构成的表称为表尾,非空广义表的表尾必定是一个表。 例如在广义表中 LS={1,{2,3},4} 中,表头为1,表尾为{2,3}和4组成的子表,即{{2,3},4}。

刷题总结 1.25 1.26(有没看懂的题)_第2张图片

顺序存储结构的地址在内存中是连续的,所以可以通过计算地址实现随机存取,

而链式存储结构的存储地址不一定连续,只能通过结点的指针顺序存取

刷题总结 1.25 1.26(有没看懂的题)_第3张图片

栈是解决封闭对应问题的有效方法。

比如在解析XML中,遇到一个标签(左标签)就入栈,遇到其子标签的左标签(如)同样入栈。遇到右标签(如)就校验栈顶标签是否与该右标签对应,能对应就出栈,不能对应则说明标签不对称,是无效的XML文件。

刷题总结 1.25 1.26(有没看懂的题)_第4张图片

在有N个结点的二叉链表中必定有2N个链域。除根结点外,其余N-1个结点都有一个父结点。所以,一共有N-1个非空链域,其余2N-(N-1)=N+1个为空链域。

刷题总结 1.25 1.26(有没看懂的题)_第5张图片

(1+2+3+...+n)/n=(n(n+1)/2)/n=(n+1)/2

刷题总结 1.25 1.26(有没看懂的题)_第6张图片刷题总结 1.25 1.26(有没看懂的题)_第7张图片刷题总结 1.25 1.26(有没看懂的题)_第8张图片

数据结构=逻辑结构+存储结构 

线性链表要求逻辑结构是线性的,存储结构不要求。

刷题总结 1.25 1.26(有没看懂的题)_第9张图片

广义表是由元素和子表构成的数据结构,其中括号表示子表。广义表运算式Tail(((a,b),(c,d)))表示取广义表的尾部。

详细解释:广义表(((a,b),(c,d)))表示一个包含两个子表的广义表。第一个子表是(a,b),第二个子表是(c,d)。尾部操作Tail()会返回广义表中除了首部元素外的所有元素,也就是去掉第一个子表的结果。因此,操作结果是(c,d)。

刷题总结 1.25 1.26(有没看懂的题)_第10张图片

head() 返回列表的第一个元素;

tail() 返回列表的删去第一个元素之后的剩余列表;

tail(K)为n,(p,(q,s)),(h,f);

tail[tail(K)]为(p,(q,s)),(h,f);

head[tail[tail[K]]]的值为(p,(q,s)),再应用tail,得到(q,s),再应用head,得到q。

(没看懂)

刷题总结 1.25 1.26(有没看懂的题)_第11张图片

归并排序的基本思想是将待排序的序列分成两个子序列,分别进行排序,然后将两个已经排序的子序列合并成一个有序序列。

对于长度为M的有序链表,每个链表的归并排序的时间复杂度是O(MlogM)。因为链表是有序的,所以可以使用归并排序的思想,将链表拆分成两个更小的链表,然后分别进行排序,最后再合并成一个有序链表。这个过程的时间复杂度是O(MlogM)。

假设有N条长度均为M的有序链表,那么每次归并排序的过程中,都需要将这N条链表分成两个部分,然后分别递归地对每个部分进行排序。所以,归并排序的时间复杂度可以表示为:

T(N) = 2 * T(N/2) + O(M*logM)

通过递归展开可以得到:

T(N) = 2^k * T(N/2^k) + k * O(M*logM)

当k=logN时,T(N) = N * O(M*logM)

所以,N条长度均为M的有序链表的归并排序的时间复杂度是O(NMlogN)。

刷题总结 1.25 1.26(有没看懂的题)_第12张图片

堆排序中,初始化堆(构建堆)的时间复杂度为O(N),反复重建(重建堆)的时间复杂度为O(logN),从而N个元素堆排序的时间复杂度为O(NlogN)

刷题总结 1.25 1.26(有没看懂的题)_第13张图片

刷题总结 1.25 1.26(有没看懂的题)_第14张图片

刷题总结 1.25 1.26(有没看懂的题)_第15张图片

迭代是利用变量的原值推出新值,是某段代码实现循环,不断地精益求精。

而递归是自己调用自己。

迭代 ≠ 递归。

刷题总结 1.25 1.26(有没看懂的题)_第16张图片

递归次数,取决于递归树,而递归树取决于轴枢的选择。树越平衡,递归次数越少。

而对分区的长短处理顺序,影响的是递归时对栈的使用内存,而不是递归次数。

A、递归次数与初始数据的排列次序有关,若有序,则递归次数增多;

刷题总结 1.25 1.26(有没看懂的题)_第17张图片

B、C 每次划分应该先处理较短的分区,只是减少递归占用的内存空间,并不能减少次数。

未看第五题:刷题总结 1.25 1.26(有没看懂的题)_第18张图片

刷题总结 1.25 1.26(有没看懂的题)_第19张图片刷题总结 1.25 1.26(有没看懂的题)_第20张图片

你可能感兴趣的:(算法)