我最近一直在练习算法和数据结构,并在网上书的mergesort上进入了https://runestone.academy/runestone/static/pythonds/SortSearch/TheMergeSort.html部分。本书提供了该算法的实现,我尝试重写它,以便使用更少的空间,这是我的代码(请参阅本书代码的链接):
def mergeSort(alist, l, r):
if r - l >= 1:
mid = (r + l)//2
mergeSort(alist, l, mid)
mergeSort(alist, mid+1, r)
i = l
j = mid+1
k = l
temp_list = alist[:]
while i < mid+1 and j < r+1:
if temp_list[i] <= temp_list[j]:
alist[k] = temp_list[i]
i=i+1
else:
alist[k] = temp_list[j]
j=j+1
k=k+1
while i < mid+1:
alist[k] = temp_list[i]
i=i+1
k=k+1
while j < r+1:
alist[k] = temp_list[j]
j=j+1
k=k+1
从我一直在线阅读的内容来看,我的版本的空间复杂性和在此链接https://runestone.academy/runestone/static/pythonds/SortSearch/TheMergeSort.html上可以找到的是O(n)
。如果按照链接中的操作方式进行操作,很容易犯错误,即假设空间复杂度为O(nlogn)
,但由于并非所有堆栈帧都“同时存在”,因此实际上O(n)
是正确的?
每次合并时,我的版本只会创建一个大小为n
的附加列表,因此我在堆栈上没有多余的空间来存储左右子列表。
所以我的问题是:
a)尽管两个版本都使用O(n)
空间,但我的实际使用空间是否比书中的空间要少一些常数值?
b)时间复杂度如何?我不认为它已经改变了...但是我是新手,所以也许我搞砸了。
谢谢
d_darric