【问题标题】:Does my code for Heap sort run in O(n lgn) time? Just want to confirm我的堆排序代码是否在 O(n lgn) 时间内运行?只是想确认
【发布时间】:2018-08-18 06:31:34
【问题描述】:

这段代码的复杂度是多少?我认为它是 O(n lgn),但我对时间复杂度相对较新,所以我只想确定一下。我很确定你也可以使用 maxHeap 来获得相同的结果,但我发现使用 minHeap 更直观。(我刚刚编辑了这个)

def minHeap(array, n, i): #creates minHeap of array and returns it
smallest = i

left = 2*i+1
right = 2*i+2

if left < n:
    if array[smallest] > array[left]:
        smallest = left
if right < n:
    if array[smallest] > array[right]:
        smallest = right



if smallest <> i:
    array[smallest] , array[i] = array[i], array[smallest]
    minHeap(array, n, left)
    minHeap(array, n, right)
    minHeap(array, n, i)
    return array
else:
    if left < n:
        minHeap(array, n, left)
    if right < n:
        minHeap(array, n, right)
    if left < n:
        if array[smallest] > array[left]:
            smallest = left
    if right < n:
        if array[smallest] > array[right]:
            smallest = right
    if smallest <> i:
        array[smallest] , array[i] = array[i], array[smallest]
    return array

def heapSort(arr): #the actual sorting algorithm that uses a minHeap
    minheap = minHeap(arr, len(arr), 0)
    sortedarray = []

    for n in range(0,len(arr)):
        sortedarray.append(minheap[0])
        minheap[0], minheap[-1] = minheap[-1], minheap[0]
        minheap.pop(-1)
        minheap = minHeap(minheap, len(minheap), 0)
    return sortedarray

【问题讨论】:

  • minHeap() 应该做什么?因为minHeap([2, 3, 4, 1], 4, 0) 没有构建堆,这似乎是有效的输入。
  • dhke- 我刚刚编辑了我的 minHeap() 代码,所以它现在应该可以工作了
  • No, it's still not making a min heap. 这看起来根本不像一个最小堆数据结构——没有堆推送或堆弹出操作。看起来 minHeap 唯一正确的是将最小元素放在前面,这恰好是 not-actually-a-heapsort heapSort 唯一依赖的东西。

标签: python sorting data-structures heapsort


【解决方案1】:

它是O(N²),N 的长度是arr。

您正在调用N 次函数minHeap:

for n in range(0,len(arr)):
    ...
    minheap = minHeap(minheap, len(minheap), 0)

并且该函数minHeap 以递归方式调用自身以获取i 的所有可能值。除了那个递归调用之外,minHeap 的代码似乎在O(1) 中执行。 minHeap 的复杂度是O(N)。

一个简单的技巧可以让您计算复杂度:计算调用minHeap 的次数。在该函数的开头仅使用print(i),您会看到minHeap 的时间复杂度与其初始输入的大小成线性关系。

您调用N 乘以O(N) 的函数,总复杂度为O(N²)。

【讨论】:

  • 如何将代码的复杂度降低到 O(n lgn)?再说一次,我是新手,似乎真的不太了解它。
  • @SiddharthG,阅读en.m.wikipedia.org/wiki/Binary_heap,这一切都在此处进行了解释。另外,我怀疑你的堆创建是 O(n),但我没有深入研究。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2013-11-01
  • 2023-03-23
  • 1970-01-01
  • 2019-04-20
相关资源
最近更新 更多