Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-从堆中删除索引i处的元素_Python_Class_Heap - Fatal编程技术网

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

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(

我正在尝试为堆编写一个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(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)