Assignment - 使用单链表实现有序表合并
- 生成两个集合 L a L_a La, L b L_b Lb(无重复元素)
- 对 L a L_a La、 L b L_b Lb 按着升序排序(使用学过的方法)
- L a L_a La、 L b L_b Lb 合并(升序)
- 分析时间与空间复杂度
英文版报告
(英文版报告相对更加完整)
【SEU 数据结构】Data Structure (2021 Spring) - Report for Assignment 3
主体思路
先把非 this
的单链表拷贝一份,再通过修改后继指达到合并效果。
Tip: 注意判断是否有重复元素。
核心代码
TVJ_Forward_List.h 和 Sample.cpp 详见我的 GitHub Repository: https://github.com/Teddy-van-Jerry/TVJ_Forward_List,
或者我的博客: https://blog.csdn.net/weixin_50012998/article/details/115029881。
结果与分析
结果
单链表合并成功!
tvj::forward_list
类介绍
详见我的博客 https://blog.csdn.net/weixin_50012998/article/details/115029881。
时间复杂度
这需要分 Release 模式和 Debug 模式:
Release 模式下不检查是否已排好序,直接合并,所需时间即拷贝和合并的时间,均与元素个数成正比,因而时间复杂度为 O ( n 1 + n 2 ) O(n_1+n_2) O(n1+n2)
Debug 模式下还需检查是否已排序以及未排序时调用 merge
函数排序(实际为归并排序),因而最好的时间复杂度为
O
(
n
1
+
n
2
)
O(n_1+n_2)
O(n1+n2)而最差的时间复杂度即排序的时间复杂度为
O
(
n
1
log
n
1
+
n
2
log
n
2
)
O(n_1\log n_1 + n_2\log n_2)
O(n1logn1+n2logn2)
空间复杂度
赋制、检查是否已排序、排序、合并都几乎不使用临时存储,因而空间复杂度为 O ( 1 ) O(1) O(1)
总结
写合并本身并不难,但是做到 exception 的 throw 以及各种操作较为困难。这个程序也借鉴了 C++ 标准库的内容。
ALL RIGHTS RESERVED © 2021 Teddy van Jerry
欢迎转载,转载请注明出处。