What Is a Max Heap?
Explore the concept of max heaps, a complete binary tree where parents are greater than their children, ensuring quick access to the largest element. Learn core operations such as insert, extract max, peek, and size, with practical Go implementations. Understand when to use max heaps for priority tasks and efficient retrieval of maximum values.
We'll cover the following...
Max heap
A max heap is a complete binary tree where every parent node is greater than or equal to its children. This means the largest element in the entire heap is always at the root, making it instantly accessible at any time.
Example: Consider a max heap containing the values 14, 10, 8, 5, 2.
The root is 14 because it is the largest element. Its children are 10 and 8, both of which are less than 14. Similarly, 10's children are 5 and 2, both of which are less than 10. This ordering holds at every level of the tree, which makes it a valid max heap.
In array form, this heap is stored as [14, 10, 8, 5, 2], with the root at index 0. In Go, we can represent this using a slice.
Key operations on a max heap
Now that we understand what a max heap is, let's explore the fundamental operations that allow us to interact with it. These operations define what makes a max heap useful and how we manipulate the data it holds.
The isEmpty operation
The isEmpty operation returns true if the heap is empty. This is crucial before attempting to remove or view elements, as attempting to extract from an empty heap results in an error.
Example: Consider a max heap that currently holds [14, 10, 8, 5, 2]. The size is 5. Calling isEmpty() on this heap would return false because size is 5, not 0.
If we were to extract the maximum one by one until no elements remain, size would eventually become 0. At that point, calling isEmpty() would return true.
Go implementation
In a slice-backed max heap, we check if size equals 0. We initialize size to 0 when creating an empty heap, so if it is still 0, no elements have been added.
The isFull operation
The isFull operation checks whether the heap has reached its maximum capacity. This is only relevant for heaps that use a fixed-size backing slice. Before inserting a new element, we should check if there is space available.
Example: Consider a max heap with capacity 5 that currently holds [14, 10, 8, 5, 2]. The size is 5 and the capacity is 5. Since size equals capacity, the heap is full. Calling isFull() would return true.
If we extract the maximum element (14), size would become 4. Now size (4) is less than capacity (5), so calling isFull() would return false.
Go implementation
In a slice-backed max heap, we check if size ...