Hello, everyone! Today we will solve the problem of implementing a Absolute Value Heap. We will tackle an algorithm problem and utilize C# features in the process. The ‘Absolute Value Heap’ mentioned earlier is a special heap that is sorted based on the absolute values using a heap structure. This topic often appears in algorithm problems.
Problem Description
The Absolute Value Heap supports the following functionalities:
- Remove and print the number with the smallest absolute value.
- If the absolute values are the same, remove and print the number with the smaller actual value first.
- Add a new integer.
For example, we can perform the following operations:
1. Insert: 3 2. Insert: -1 3. Insert: -2 4. Remove
As a result of the above operations, the value that will be removed is -1. Therefore, the problem we need to solve is as follows:
Problem
Implement the functionalities of the Absolute Value Heap. Given N operations, provide the appropriate outputs for each operation.
The input comprises several integers, each representing one of the following three operations:
0
: Remove and print the number with the smallest absolute value from the Absolute Value Heap.X
: Insert the integerX
into the Absolute Value Heap.
Input and Output
Input
The first line contains the number of operations N
. (1 ≤ N ≤ 100,000)
Subsequent lines will contain the operations, where each operation is X
(-1,000,000 ≤ X
≤ 1,000,000) or 0
.
Output
Print each removed number on a new line. If there are no numbers to remove, print 0
.
Solution
Now, let’s write the C# code to solve the problem. In this problem, we can implement the Absolute Value Heap using a Priority Queue.
Priority Queue (Heap) Explanation
A priority queue has each element associated with a priority, and in this case, a heap structure is used. In C#, it can be easily implemented using SortedSet
or PriorityQueue
.
C# Code Implementation
Below is the C# code that implements the Absolute Value Heap:
using System;
using System.Collections.Generic;
using System.Linq;
class AbsoluteHeap
{
static void Main()
{
int n = int.Parse(Console.ReadLine());
var pq = new SortedSet<(int absolute, int value)>();
for (int i = 0; i < n; i++)
{
int x = int.Parse(Console.ReadLine());
if (x == 0)
{
if (pq.Count == 0)
{
Console.WriteLine(0);
}
else
{
var min = pq.First();
pq.Remove(min);
Console.WriteLine(min.value);
}
}
else
{
pq.Add((Math.Abs(x), x));
}
}
}
}
Code Explanation
The above code demonstrates a simple way to implement an Absolute Value Heap. The main steps are as follows:
- Receive Input: Read the number of operations N from the first line, then process N operations from the following lines.
- Initialize Priority Queue: Use
SortedSet
to store tuples in the form (absolute value, actual value). Here, it is sorted based on the absolute value, and in case of ties, it is sorted by the actual value. - Process Operations: For each operation, if x is 0 (remove operation), remove and print the minimum value from the
SortedSet
. If no value exists, print 0. If x is not 0, add the absolute value and actual value as a tuple.
Efficiency
This algorithm stores and removes input values based on absolute values with a logarithmic complexity. Therefore, the complexity is O(N log N). In most cases, this level of time complexity will meet the input constraints.
Conclusion
In this post, we learned how to implement an Absolute Value Heap. We can efficiently solve algorithm problems by utilizing the SortedSet feature of C#. When tackling algorithm problems, it is important to carefully read the problem requirements and choose the appropriate data structure. We will return next time with another interesting algorithm problem!