我必须在Python中构建完整的MIN-HEAP实现,而不使用内置的堆函数。在Python中构建MIN-HEAP
所以我有父母,左子女和右子女的定义,这需要在考虑从0蟒蛇号码列表元素:
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 = []
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: 好的,所以我修复了父/子/儿的定义。我检查过,他们返回正确的值。这里是代码:
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函数(这使得列表中的最小堆不在列表中)。我在目的之前和之后使用打印,以确定它是否有效......但事实并非如此。它两次返回相同的列表,没有编译错误或任何东西。任何想法如何解决它?
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)
但是当我运行它,我得到这个第一个随机生成的表格(如我应该),和而不是最小堆表,我得到无值,如下图所示:
[34, 9, 94, 69, 77, 33, 56]
None
任何IDE如?也许我应该以另一种方式去做,而不是将l [i]与父母进行比较,但是l [i]是左右儿童?
谢谢你的提示。我清理了父/小孩/小孩的定义,并检查 - 他们工作良好(返回表中的索引) 但我仍然有我的** bkop **函数的问题。你能看到EDIT1到我原来的帖子吗? – kjubus
谢谢,我忽略了这些错误。但我仍然没有得到它的工作。你能看看EDIT 2吗? – kjubus
@编辑2 - 没有用。我仍然het **没有**返回 – kjubus