# Median in a stream of integers (running integers)

## An Overview of Median Understanding

When values are arranged in ascending or descending order, the median of a dataset is the value that separates the higher half from the lower half. The fact that it is unaffected by extreme values means that it offers a more balanced perspective than the mean (average). When dealing with a continuous stream of integers, where new numbers are introduced without a predetermined endpoint, computing the median becomes especially interesting.

### The Struggle with Running Integers

Finding the median is particularly challenging when dealing with running integers. Efficiency is needed to keep up with the changes and compute the new median in real-time as the median continuously changes as the stream flows with each new addition. The dynamic nature of this process necessitates original answers.

## How to Approach the Median in a Stream

### Utilizing Priority Queues

The use of priority queues is one strategy for dealing with this problem. We can easily access the median at any time by keeping the two halves of the stream in separate queues. This method simplifies median calculations but necessitates careful queue management.

### Dividing the Stream with Two Heaps

One more efficient approach is to split the stream into two heaps, one for the lower half and the other for the higher. The medians can be calculated using the tops of these heaps thanks to this method. To maintain the accuracy of the median calculation, the two heaps must be in balance.

## A Step-by-Step Guide to Median Calculation

### Handling Even and Incorrect Integer Counts

The median is the middle number when the sum of the integers is odd. It is the average of the two middle numbers for an even count. Taking into account this distinction guarantees precise median calculation no matter the count.

### Adapting to Dynamic Inputs

Running integers denote ongoing modifications. The algorithm must quickly adapt to new inputs in order to calculate the median effectively. It is crucial to implement a method that supports integer additions and deletions with the lowest possible time complexity.

### The Importance of Balance

It is crucial to keep the data structure balanced and orderly. Skewed distributions can distort the median's accuracy, highlighting the need for an efficient mechanism to deal with these situations without slowing down processing.

## Real-World Applications of Running Integers

### Statistical Analysis

In many statistical analyses, medians are crucial because they give information about the distribution of data without being influenced by outliers. Running integers improve the available statistical tools even more.

### Processing Data Streams

In industries like finance, keeping an eye on the median of stock prices can provide a more accurate picture of market trends than the mean. It becomes crucial to compute the running median quickly for quick decision-making.

Using Python program to understand further

Output:

Added 4, Median: 4.0
Added 7, Median: 5.5
Added 2, Median: 4.0
Added 9, Median: 5.5
Added 1, Median: 4.0
Added 5, Median: 4.5
Added 8, Median: 5.0
Added 3, Median: 4.5
Added 6, Median: 5.0

Here's a brief explanation of the code:

1. The code starts by importing the heapq module, which provides heap-related functions.
2. The RunningMedian class is defined with three methods: __init__, insert, and find_median.
3. In the __init__ method, two heaps are initialized: min_heap to store the larger half of the numbers and max_heap to store the smaller half of the numbers.
4. The insert method is used to insert a new number into the stream. Depending on the value of the number and the heaps' contents, the number is added to the appropriate heap. Then, the heaps are balanced to ensure that their sizes differ by at most one.
5. The find_median method calculates and returns the median of the numbers seen so far. If the heaps have an equal number of elements, the median is the average of the tops of the heaps. Otherwise, the median is the top element of the max heap.
6. An example usage is provided using the stream of numbers [4, 7, 2, 9, 1, 5, 8, 3, 6]. A median_finder object of the RunningMedian class is created. The stream is iterated, and for each number, it's inserted into the median_finder, and the current median is printed.

## Embracing the Power of Algorithms

The Study of Time Complexity

Reliable running median calculation is significantly aided by efficient algorithms. Selecting the most effective tactic for a given application requires an understanding of the time complexity of various approaches.

Optimizing for Performance

The limits of what is possible are continuously pushed by algorithmic improvements. Even in situations of extreme pressure, flawless median calculations are ensured by performance-optimizing the code.