The max value in the max heap isn't the correct value

Question:

The program takes as input:

(string)’yyyy-mm-dd’, (int)sensor id, (int)covid level.

The expected output is: yyyy-mm-dd,covid level.

Input: 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

I have provided my code below. My output doesn’t work correctly when the input is large. I think the heapify got screwed up somewhere. Here is my code:

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()                                

My output for this input:

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

is: 2023-08-30,425287

It’s supposed to be: 2021-07-17,993694

Could someone please help me? I’ve fixated on this question for way too long now.

Asked By: nskcwcre

||

Answers:

The problem is your sorting. You are sorting based on date. If you change your loop inside insert to this, you’ll sort by the numeric value and things work fine:

        while self.Heap[current][1] > self.Heap[self.parent(current)][1]:
Answered By: Tim Roberts