python - 从堆中删除索引 i 处的元素

python - deleting element at index i from heap

我正在尝试为堆编写删除函数。我得到了一个 head class 和 heapify 函数来使用,我只需要实现删除。我想在 O(log n) 时间内实现它。这是我试过的:

from heap import *
class heap_delete(heap):
    def delete(self, i):
        self.A[i] = self.A[-1] #put the bottom rightmost element in i
        self.min_heapify(i) 

但是当我用提供的测试代码 运行 时,它显示 'failed'。阅读 AssertionError 声明似乎我试图操作的索引没有发生任何事情。这是我正在导入的堆代码:

def parent(i):
    return int(i/2)
def left(i)
    return 2*i
def right(i):
    return 2*i+1
class heap:
    def __init__(self):
        self.A = [None] #to make it 1 based, None is stuck at 0
    def __getitem__(self, i):
        return self.A[i]
    def min_heapify(self, i):
        l = left(i)
        r = right(i)
        smallest = i
        if l <= self.heapsize and self.A[l] < self.A[i]:
            smallest = l
        if r <= self.heapsize and self.A[r] < self.A[smallest]:
            smallest = r
        if smallest != i:
            self._swap(i, smallest)
            self.min_heapify(smallest)
    def _swap(self, index1, index2):
        self.A[index1], self.A[index2] = self.A[index2], self.A[index1]

还有decrease_key、extract_min、插入等功能。如有必要,我可以将它们添加到 post,但我相信我需要的一切都在这里。我收到的 AssertionError 如下:

    self.assertEquals(h.A, [None])
AssertionError: Lists differ: [None, 5] != [None]

    self.assertEquals(h.A, [None])
AssertionError: Lists differ: [None, 15] != [None]

前一个 AssertionError 来自我应该 运行 我的代码的测试函数。它调用 h.insert(5)h.delete(1),然后调用 self.assertEquals(h.A, [None])。同样在测试函数中的梯形图在 5、15、10 和 0 上调用 insert,然后是 h.delete(h.A.index(10)),然后是与之前相同的 assertEquals 语句。 由此我相信我的删除功能没有删除任何东西。我尝试使用 del 和提供的 _swap 但可能没有正确使用它们。我再次寻找 O(log n) 时间,所以如果有人能指出我正确的方向,那就太好了。

当您从堆中删除时,您的数组大小应该会下降。您的删除功能目前没有发生这种情况:)。

def delete(self, i):
    self.A[i] = self.A[-1] #put the bottom rightmost element in i
    del self.A[-1]         # <--- shrink the list
    self.min_heapify(i)