我必须在 Python 中构建一个完整的 MIN-HEAP 实现,而不使用内置的堆函数。
所以我有父母,左孩子和右孩子的定义,考虑到从0开始的python编号列表元素:
from random import randint
import math
def parent(i):
x = int(l.index(l[i])) #########3
y = int(math.floor(x/2))
return y-1
def lchild(i):
x = int(l.index(l[i]))
y = int(math.floor(x*2))
return y-1
def rchild(i):
x = int(l.index(l[i]))
y = int(math.floor(x*2 + 1))
return y-1
然后我有一部分代码为我生成(伪)随机列表到列表l中:
l = []
dl = int(input)
for i in range (0, dl):
x = int(randint(1,100))
l.append(x)
直到此时一切正常。然后我有一个函数 bkop 用于将表l变成最小堆。
def bkop(l):
j = 0
for i in range(0, len(l)):
if int(l[i]) < int(parent(l[i])): #########2
l[i], l[parent(i)] = l[parent(i)], l[i]
j = j+1
if j != 0:
bkop(l)
然后我想运行一个程序并查看结果:
bkop(l) #########1
print l
程序崩溃,错误列表索引超出范围,指向我用######### 标记的 3 行。我大约一个月前开始写这篇文章,我很确定,那个父母、lchild 和 rchild 当时都在工作。你知道,怎么了?
EDIT1:好的,所以我已经修复了 parent/lchild/rchild 定义。我检查过,它们返回正确的值。这是代码:
def parent(i):
x = i + 1
y = x//2
return y-1
def lchild(i):
x = i + 1
y = x*2
return y-1
def rchild(i):
x = i + 1
y = x*2 + 1
return y-1
生成随机列表的函数几乎完好无损。然后我有这个 bkop 函数(从l列表中生成一个最小堆)。我故意在前后使用 print 来确定它是否有效......但它没有。它两次返回相同的列表,没有编译错误或任何东西。知道如何解决吗?
print(l)
def bkop(l):
j = 0
for i in range(0, len(l)):
if l[i] < parent(i):
l[i], l[parent(i)] = l[parent(i)], l[i]
j = j+1
if j != 0:
bkop(l)
bkop(l)
print l
EDIT2:好的,所以我已经按照您的建议修复了 bkop :
print bkop(l)
def bkop(l):
j = 0
for i in range(1, len(l)):
if l[i] < l[parent(i)]:
l[i], l[parent(i)] = l[parent(i)], l[i]
j = j+1
if j != 0:
bkop(l)
bkop(l)
print bkop(l)
但是当我运行它时,我首先得到一个随机生成的表(我应该这样做),而不是最小堆表,我得到None值,如下所示:
[34, 9, 94, 69, 77, 33, 56]
None
有任何想法吗?也许我应该换一种方式来做,不是将 l[i] 与父母进行比较,而是将 l[i] 与左右孩子进行比较?