python-从堆中删除索引i处的元素
我正在尝试为堆编写一个delete函数。我有一个head类和heapify函数可以使用,我只需要实现delete。我想在python-从堆中删除索引i处的元素,python,class,heap,Python,Class,Heap,我正在尝试为堆编写一个delete函数。我有一个head类和heapify函数可以使用,我只需要实现delete。我想在O(logn)time中实现它。这就是我尝试过的: 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(
O(logn)
time中实现它。这就是我尝试过的:
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)
但当我使用提供的测试代码运行它时,它会显示“失败”。阅读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]
及
前一个AssertionError
来自我应该用来运行代码的测试函数。它调用h.insert(5)
和h.delete(1)
,然后调用self.assertEquals(h.A,[None])
。同样在测试函数中,梯形图在5、15、10和0上调用insert
,然后调用h.delete(h.A.index(10))
,然后调用与前面相同的assertEquals
语句。
从这一点上,我相信我的delete函数不会删除任何内容。我尝试过使用
del
和提供的\u交换
,但可能没有正确使用它们。我再次寻找O(logn)时间,因此如果有人能为我指出正确的方向,那就太好了。当你从堆中删除时,你的数组大小应该会下降。您的删除函数中当前没有发生这种情况:)。def delete(self,i):
self.A[i]=self.A[-1]#将最右下角的元素放在i中
del self.A[-1]#一个self.heapsize-=1
语句可以解决这个问题吗?你的列表是A…,所以你需要在某个地方执行删除操作,而不是将最右下角的元素(A[-1]
)设置为A[i]
?或者我应该干脆把'dela[I]`?self.A[I]=self.A[-1]#把最右下角的元素放在I中如果这就是你所指的,那么你只是把最后一个元素复制到I的位置。这是正确的,但只是故事的一半(即使在你死后)。复制后底部元素仍然存在于A[-1],你看到问题了吗?要进一步扩展,请使用随机堆(如A=[10,4,6,1,2,1,2])跟踪代码,删除第三个元素,然后再次删除新的第三个元素。我真不敢相信我忘记删除旧元素了!我觉得很傻。我添加了del
语句,还添加了一个self.heapsize-=1
来完成它。可能是
self.assertEquals(h.A, [None])
AssertionError: Lists differ: [None, 5] != [None]
self.assertEquals(h.A, [None])
AssertionError: Lists differ: [None, 15] != [None]
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)