【PTA】线性表及复杂度

博客包含PTA数据结构的判断题和选择题。判断题涉及顺序存储线性表的访问、增加、删除结点时间复杂度,链表元素地址等;选择题围绕顺序表操作、时间复杂度计算、存储方式选择等,对数据结构相关知识进行了考查与解析。

判断题

1-1
对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。
T

1-2
若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用顺序表存储最节省时间。
T

1-3
对于顺序存储的长度为N的线性表,删除第一个元素和插入最后一个元素的时间复杂度分别对应为O(1)和O(N)。
F —— 应为 N 和 1

以上三题归纳

1. 新增元素: O(N) (尾插是O(1),不考虑扩容的情况)
2. 查找元素: O(N)
3. 根据下标获取/修改元素:O(1)
4. 删除元素:O(N)
5. 清除所有元素:O(1)
其中插入删除平均为O(N)
如果插入和删除的是最后一个元素,那么很显然是O(1);
如果是插入和删除的是第一个元素,那么很显然是O ( n );
如果是插入和删除的是第i个元素,那么很显然是O(n-i);

1-4
若用链表来表示一个线性表,则表中元素的地址一定是连续的。
F —— 地址可连续也可不连续

1-5
在具有N个结点的单链表中,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)
F —— 单链表也称线性链表,对链表的结点进行访问无论是否具体指出访问哪个元素,都要从头遍历链表,所以访问操作的时间复杂度为 O(n) 。增加结点即插入结点,如果指明插入到某个位置则时间复杂度为 O(1) ,如果没有指明插入位置,如 按大小插入,则先要遍历一遍来确定插入的位置然后再插入,此时的时间复杂度为 O(n) 。

选择题

2-1

在N个结点的顺序表中,算法的时间复杂度为O(1)的操作是:

(2分)

A.
访问第i个结点(1≤i≤N)和求第i个结点的直接前驱(2≤i≤N)

B.
在第i个结点后插入一个新结点(1≤i≤N)

C.
删除第i个结点(1≤i≤N)

D.
将N个结点从小到大排序

2-2

对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度为:

(2分)

A.
O(1), O(1)

B.
O(1), O(N)

C.
O(N), O(1)

D.
O(N), O(N)

2-3

若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用哪种存储方式最节省时间?

(2分)

A.
双链表

B.
单循环链表

C.
带头结点的双循环链表

D.
顺序表

2-4

顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( )。

(2分)

A.
100

B.
105

C.
108

D.
110

2-5

下列函数中,哪两个函数具有相同的增长速度:
(2分)

A.2​N​​ 和N​N

B.N和2/N

C.N​2​​ logN和NlogN​2

D.NlogN​2​​ 和NlogN

2-6

算法的时间复杂度取决于( )。

(2分)

A.
问题的规模

B.
待处理数据的初态

C.
计算机的配置

D.
A和B

2-7

已知两个长度分别为m和n的升序链表,若将它们合并为一个长度为m+n的降序链表,则最坏情况下的时间复杂度是( )。

(2分)

A.
O(n)

B.
O(mn)

C.
O(min(m,n))

D.
O(max(m,n))

2-8

下列代码的时间复杂度是:

for(i=0; i<N; i++)
for(j=0; j<N; j+=1000)
printf("%d,%d\n", i, j);
(2分)

A.
O(N×j)

B.
O(N)

C.
O(N​2​​ )

D.
O(NlogN)

2-9

下面程序段的时间复杂度是 ( )

i = 0;
while(i<=n)
i = i * 3;
(2分)

A.
O(2n)

B.
O(n)

C.
O(n​2​​ )

D.
O(log​3​​ n)

2-10

程序段

FOR i:=n-1 DOWNTO 1 DO
FOR j:=1 TO i DO
IF A[j]>A[j+1]
THEN A[j]与A[j+1]对换;
其中 n为正整数,则最后一行的语句频度在最坏情况下是( )

(2分)

A.
O(n)

B.
O(nlogn)

C.
O(n​3​​ )

D.
O(n​2​​ )

2-11

1、下列叙述中正确的是

(1分)

A.
程序执行的效率与数据的存储结构密切相关

B.
程序执行的效率只取决于程序的控制结构

C.
程序执行的效率只取决于所处理的数据量

D.
以上说法均错误

ABDCD DDCDD A
### 关于线性表合并的PTA练习题及解法 #### 题目描述 假设存在两个已排序的线性表 $L_1$ 和 $L_2$,分别表示为数组形式。目标是将这两个线性表合并成一个新的有序线性表 $L_{\text{merged}}$,且新线性表仍然保持升序排列。 --- #### 解决方案分析 为了实现这一功能,可以采用双指针方法[^1]。这种方法的时间复杂度为 $O(n+m)$,其中 $n$ 是第一个线性表的长度,$m$ 是第二个线性表的长度。以下是具体思路: - 初始化两个指针 $i$ 和 $j$,分别指向 $L_1$ 和 $L_2$ 的起始位置。 - 创建一个空的结果列表 $L_{\text{result}}$ 来存储最终的合并结果。 - 比较当前 $L_1[i]$ 和 $L_2[j]$ 的大小: - 如果 $L_1[i] \leq L_2[j]$,则将 $L_1[i]$ 添加到 $L_{\text{result}}$ 中,并移动指针 $i$ 到下一个位置。 - 否则,将 $L_2[j]$ 添加到 $L_{\text{result}}$ 中,并移动指针 $j$ 到下一个位置。 - 当其中一个线性表被完全处理完毕后,将另一个线性表剩余的部分直接追加到 $L_{\text{result}}$ 中。 此过程无需额外的空间开销用于临时变量存储,因此空间复杂度为 $O(1)$。 --- #### 实现代码 以下是一个基于 Python 的实现示例: ```python def merge_sorted_lists(L1, L2): i, j = 0, 0 merged_list = [] while i < len(L1) and j < len(L2): # 双指针比较两列表元素 if L1[i] <= L2[j]: merged_list.append(L1[i]) i += 1 else: merged_list.append(L2[j]) j += 1 # 将未处理完的列表部分加入结果 while i < len(L1): merged_list.append(L1[i]) i += 1 while j < len(L2): merged_list.append(L2[j]) j += 1 return merged_list # 测试用例 L1 = [1, 3, 5] L2 = [1, 2, 3, 4, 5] print(merge_sorted_lists(L1, L2)) # 输出应为 [1, 1, 2, 3, 3, 4, 5, 5] ``` 上述代码实现了两个有序线性表的合并操作,通过双指针技术确保效率最大化。 --- #### 注意事项 在实际应用中,如果输入的数据量较大或者需要频繁执行此类操作,建议考虑更高效的算法或数据结构优化策略。例如,在某些场景下可能更适合使用堆栈或其他高级数据结构来减少内存占用和提高性能[^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值