非空广义表的第一个元素称为表头,他可以是一个单元素,也可以是一个子表;所以选D。
广义表(Generalized List)是一种数据结构,它可以用于表示多层次的、具有递归结构的数据。广义表可以包含数据项和子广义表,数据项可以是任意类型的数据,而子广义表则是一个嵌套的广义表。
广义表可以用于表示复杂的数据结构,例如树、图等。它可以提供一种灵活、递归的方式来组织和处理数据。在编程语言中,广义表通常作为一种数据类型或抽象数据类型来实现。
广义表(Generalized List)是一种扩展了线性链表(linked list)的数据结构,它可以包含其他广义表或者元素。广义表可以包括以下部分:
原子元素(Atom):原子是广义表中的基本元素,可以是任意类型的数据,如整数、浮点数、字符等。
空表(Empty List):空表表示一个没有任何元素的广义表,可以用空集合符号“∅”或者空括号“()”表示。
列表(List):列表是广义表的基本组成部分,它可以包含原子元素或者其他列表。列表由一对括号“()”包围,其中元素之间用逗号“,”分隔。例如,(1, 2, 3) 是一个包含三个整数元素的列表。
嵌套列表(Nested List):广义表可以嵌套包含其他广义表,形成嵌套列表的数据结构。嵌套列表可以是任意层次的,也可以包含不同层次的嵌套。例如,((1, 2), (3, 4)) 是一个包含两个嵌套列表的广义表。
广义表的扩展性使其成为一种灵活的数据结构,可以用来表示复杂的数据关系,适用于各种领域的编程问题。
广义表通过使用两个特殊的符号来表示:逗号(,)用于分隔不同的数据项,而括号()用于标识子广义表的开始和结束。
拓展:除表头元素之外,由其余元素所构成的表称为表尾,非空广义表的表尾必定是一个表。 例如在广义表中 LS={1,{2,3},4} 中,表头为1,表尾为{2,3}和4组成的子表,即{{2,3},4}。
顺序存储结构的地址在内存中是连续的,所以可以通过计算地址实现随机存取,
而链式存储结构的存储地址不一定连续,只能通过结点的指针顺序存取;
栈是解决封闭对应问题的有效方法。
比如在解析XML中,遇到一个
在有N个结点的二叉链表中必定有2N个链域。除根结点外,其余N-1个结点都有一个父结点。所以,一共有N-1个非空链域,其余2N-(N-1)=N+1个为空链域。
(1+2+3+...+n)/n=(n(n+1)/2)/n=(n+1)/2
数据结构=逻辑结构+存储结构
线性链表要求逻辑结构是线性的,存储结构不要求。
广义表是由元素和子表构成的数据结构,其中括号表示子表。广义表运算式Tail(((a,b),(c,d)))表示取广义表的尾部。
详细解释:广义表(((a,b),(c,d)))表示一个包含两个子表的广义表。第一个子表是(a,b),第二个子表是(c,d)。尾部操作Tail()会返回广义表中除了首部元素外的所有元素,也就是去掉第一个子表的结果。因此,操作结果是(c,d)。
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。
(没看懂)
归并排序的基本思想是将待排序的序列分成两个子序列,分别进行排序,然后将两个已经排序的子序列合并成一个有序序列。
对于长度为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)。
堆排序中,初始化堆(构建堆)的时间复杂度为O(N),反复重建(重建堆)的时间复杂度为O(logN),从而N个元素堆排序的时间复杂度为O(NlogN) 。
迭代是利用变量的原值推出新值,是某段代码实现循环,不断地精益求精。
而递归是自己调用自己。
迭代 ≠ 递归。
递归次数,取决于递归树,而递归树取决于轴枢的选择。树越平衡,递归次数越少。
而对分区的长短处理顺序,影响的是递归时对栈的使用内存,而不是递归次数。
A、递归次数与初始数据的排列次序有关,若有序,则递归次数增多;
B、C 每次划分应该先处理较短的分区,只是减少递归占用的内存空间,并不能减少次数。