[英]The max value in the max heap isn't the correct value
该程序作为输入:
(字符串)'yyyy-mm-dd',(int)传感器 id,(int)covid 级别。
预期的 output 为:yyyy-mm-dd,covid 级别。
输入:2022-09-08、23、371; 2022-09-08, 2, 3171; 2022-09-08、12、43; 2021-03-21、4、129
Output: 2022 -09 -08, 3171
我在下面提供了我的代码。 当输入较大时,我的 output 无法正常工作。 我认为 heapify 在某个地方搞砸了。 这是我的代码:
import sys
class MaxHeap:
def __init__(self, maxsize):
self.maxsize = maxsize
self.size = 0
self.Heap = [0] * (self.maxsize + 1)
self.Heap[0] = ('1.1.1977', sys.maxsize)
self.FRONT = 1
# Function to return the position of parent for the node currently at pos
def parent(self, pos):
return pos // 2
# Function to return the position of the left child for the node currently at pos
def leftChild(self, pos):
return 2 * pos
# Function to return the position of the right child for the node currently at pos
def rightChild(self, pos):
return (2 * pos) + 1
# Function that returns true if the passed node is a leaf node
def isLeaf(self, pos):
if pos >= (self.size//2) and pos <= self.size:
return True
return False
# Function to swap two nodes of the heap
def swap(self, fpos, spos):
self.Heap[fpos], self.Heap[spos] = (self.Heap[spos], self.Heap[fpos])
# Function to heapify the node at pos
def maxHeapify(self, pos):
# If the node is a non-leaf node and smaller
# than any of its child
if not self.isLeaf(pos):
if (self.Heap[pos] < self.Heap[self.leftChild(pos)] or self.Heap[pos] < self.Heap[self.rightChild(pos)]):
# Swap with the left child and heapify
# the left child
if (self.Heap[self.leftChild(pos)] > self.Heap[self.rightChild(pos)]):
self.swap(pos, self.leftChild(pos))
self.maxHeapify(self.leftChild(pos))
# Swap with the right child and heapify
# the right child
else:
self.swap(pos, self.rightChild(pos))
self.maxHeapify(self.rightChild(pos))
# Function to insert a node into the heap
def insert(self, element):
if self.size >= self.maxsize:
return
self.size += 1
self.Heap[self.size] = element
current = self.size
while (str(self.Heap[current]) >
str(self.Heap[self.parent(current)])):
self.swap(current, self.parent(current))
current = self.parent(current)
# Function to print the contents of the heap
def Print(self):
for i in range(1, (self.size // 2) + 1):
print("PARENT : " + str(self.Heap[i]) +
"LEFT CHILD : " + str(self.Heap[2 * i]) +
"RIGHT CHILD : " + str(self.Heap[(2 * i) + 1]))
# Function to remove and return the maximum
# element from the heap
def extractMax(self):
ext = self.Heap[self.FRONT]
self.Heap[self.FRONT] = self.Heap[self.size]
self.size -= 1
self.maxHeapify(self.FRONT)
return ext
# Driver Code
if __name__ == "__main__":
input = input()
input = input.split(";")
dates = []
values = []
for d in input:
date = d.split(',', 2)
dates.append(date[0])
values.append(date[2])
values = [int(x) for x in values]
tuples = list(zip(dates, values))
heap = MaxHeap(len(tuples) + 1)
for t in tuples:
heap.insert(t)
max_heap = heap.extractMax()
我的 output 用于此输入:
2023-04-19,9132,438804;2022-04-04,4535,316300;2021-05-24,3079,101563;2021-04-29,7378,18098;2023-04-13,7790,15956;2023-08-16,4086,190312;2022-05-07,6779,749569;2021-07-06,9852,574634;2022-09-23,934,112247;2022-01-31,8810,405090;2020-12-22,7342,381167;2021-07-17,711,993694;2022-10-10,409,522123;2021-03-31,3392,797680;2021-04-19,5982,842608;2023-05-01,2400,487512;2021-09-20,945,842398;2020-01-18,9269,104747;2020-07-26,6781,596629;2021-08-02,8162,360261;2019-09-30,1919,637237;2022-12-06,1914,81688;2022-07-13,603,676273;2022-05-27,950,185217;2022-04-25,3386,595046;2020-04-24,4442,779015;2020-11-10,2985,366614;2021-09-08,9104,797580;2021-07-09,4635,890720;2023-01-12,7299,514824;2023-08-26,5111,261446;2022-11-30,9761,664774;2023-02-27,5702,101817;2022-10-30,7463,552832;2020-05-26,8611,635344;2020-01-10,1154,912487;2021-08-03,1751,481369;2020-09-23,5469,696646;2021-11-07,6329,836149;2022-05-18,8444,621113;2021-09-15,5352,128613;2023-07-01,6008,393441;2022-10-11,2598,346254;2019-12-18,1956,666816;2020-10-01,5303,705215;2022-12-06,3580,86464;2021-08-19,655,503907;2020-07-27,9448,414938;2021-05-29,1887,10723;2023-05-30,3787,753166;2021-04-25,615,155563;2022-07-06,5024,504939;2020-07-10,9029,980440;2020-08-21,6138,862944;2020-07-14,2660,648708;2023-05-13,5482,313792;2020-01-21,3730,401475;2022-01-23,1701,569155;2021-05-10,6324,361397;2020-07-09,7832,553689;2020-01-08,7655,261610;2022-06-23,6407,300140;2020-02-28,4394,120407;2022-01-15,8922,372324;2020-06-01,2544,903305;2021-07-18,4792,571747;2020-08-29,8251,72353;2019-09-09,4894,886404;2021-06-27,473,446021;2021-03-12,7044,711193;2020-01-11,9889,188949;2021-07-11,8809,667911;2021-04-16,7349,103581;2021-08-03,966,328995;2023-07-08,4301,48755;2022-03-20,7034,228660;2020-09-08,4874,860249;2022-03-18,3717,107146;2023-05-01,3596,582978;2022-08-02,2420,2761;2022-09-10,3728,672878;2019-12-15,2545,251375;2022-10-26,1526,376646;2021-08-29,6201,158015;2022-04-02,972,843280;2020-12-01,1891,424955;2022-10-24,7948,563497;2021-07-16,7922,901972;2023-02-01,464,870315;2020-03-29,3974,512011;2023-02-04,915,131894;2023-06-02,1889,971126;2022-01-19,7300,245778;2020-01-18,5677,154759;2023-01-20,1373,152443;2022-09-29,2471,417724;2022-09-09,2260,504994;2023-08-30,9896,425287;2021-07-16,3388,607646;2021-03-13,4559,207877;2022-09-08,42,114573
是:2023-08-30,425287
应该是:2021-07-17,993694
有人可以帮我吗? 我已经关注这个问题太久了。
问题是你的排序。 您正在根据日期进行排序。 如果您将insert
内的循环更改为此,您将按数值排序并且一切正常:
while self.Heap[current][1] > self.Heap[self.parent(current)][1]:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.