我用两种不同的方式编写了mergesort,其中一种方法的空间复杂度是否比另一种更好?

时间:2019-01-01 15:16:38

标签: python mergesort space-complexity

我最近一直在练习算法和数据结构,并在网上书的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

0 个答案:

没有答案