【问题标题】:Heap data structure in pythonpython中的堆数据结构
【发布时间】:2021-08-23 03:02:55
【问题描述】:

我已经在 python 中实现了最小堆,但经过一些测试后,我意识到有时大约在每 10 次插入后,它会将其置于错误的位置(父级大于子级)。 代码:

class minHeap():
    def __init__(self):
        self.heap = [] # main array
        
    def get_parent(self, i):
        return i//2

    def bubble_up(self):
        i = len(self.heap)-1
        p = self.get_parent(i)
        while self.heap[p] > self.heap[i]:
            self.heap[i], self.heap[p] = self.heap[p], self.heap[i] # swapping parent and child
            i = p
            p = self.get_parent(i)

    def insert(self, k):
        self.heap.append(k)
        self.bubble_up()

我最近 2 个小时一直在寻找错误,所以如果有人能帮助我,我将不胜感激。

【问题讨论】:

  • 如果您真的需要帮助,请编辑您的代码,使其成为minimal reproducible example - 包括导入和一些最少的数据 - 以便任何人都可以将代码粘贴到文件中并且 无需添加任何东西运行你的代码来查看同样的问题。
  • 您的代码仍然不是minimal reproducible example - 您需要包含一些代码来创建类的实例/调用您的方法,以及一些数据,并显示您如何知道分配是 '错误的'。自己尝试一下,就好像您正在阅读此问题一样 - 您需要在问题中的代码中添加什么才能看到与提出问题的人相同的结果?现在添加这个额外的代码,这样任何人都可以在您的问题中运行代码而无需添加任何内容

标签: python data-structures heap


【解决方案1】:

解决方案

你应该改变这个函数

def get_parent(self, i):
    return i//2

收件人:

def get_parent(self, i):
    return (i-1)//2

说明

您正在使用 python 中的列表来初始化 0-indexed

self.heap = [] # main array

现在,假设您添加了 2 个元素 1 和 5。

self.heap = [1,5]

现在。如果再添加一个元素,即 3。

self.heap = [1,5,3]

现在,3 的索引是 2。它的父级应该是 1(index = 0)。但是 i//2 会给你 5(index = 1) 作为2//2 = 1

所以,你应该使用(i-1)//2,它会给你0

(2-1)//2 = 0


希望你能理解我的解决方案?。


【讨论】:

  • @TLado 如果你觉得我的回答有用,你能接受吗?
  • 谢谢,你帮了我很多。之后我必须解决的一个问题是有时我得到 -1 作为父级的索引,这会搞砸整个代码。问题是根节点没有父节点,这就是为什么我必须做一个基本案例。之后,堆就完美运行了。
猜你喜欢
  • 2011-01-30
  • 2021-05-29
  • 2015-03-17
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
相关资源
最近更新 更多