我必須在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