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

105 Views Asked by At

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.

1

There are 1 best solutions below

0
Tim Roberts On BEST ANSWER

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