Sobes.tech
Middle — Senior

Ako spracovať tok dát na výpočet mediánu s obmedzenou pamäťou?

sobes.tech AI

Odpoveď od AI

Na výpočet mediánu v toku dát s obmedzenou pamäťou sa používajú algoritmy, ktoré nevyžadujú uloženie všetkých prvkov. Jedným z populárnych prístupov je udržiavanie dvoch dátových štruktúr (napríklad dvoch hald):

  • Max-heap pre spodnú polovicu prvkov
  • Min-heap pre hornú polovicu prvkov

Keď príde nové číslo, pridá sa do jednej z hald a potom sa ich veľkosti vyvážia tak, aby sa líšili najviac o 1. Medián je buď koreň max-heapu (ak je väčší), alebo priemer koreňov oboch hald.

Táto metóda umožňuje získať medián v čase O(log n) pre každý prvok a používať pamäť úmernú počtu prvkov, bez uloženia celého toku.

Príklad v Pythone:

import heapq

class MedianFinder:
    def __init__(self):
        self.low = []  # max-heap (invertované hodnoty)
        self.high = [] # min-heap

    def add_num(self, num):
        heapq.heappush(self.low, -num)
        # Presun najväčšieho z low do high
        if self.low and self.high and (-self.low[0]) > self.high[0]:
            val = -heapq.heappop(self.low)
            heapq.heappush(self.high, val)

        # Vyváženie veľkostí
        if len(self.low) > len(self.high) + 1:
            val = -heapq.heappop(self.low)
            heapq.heappush(self.high, val)
        elif len(self.high) > len(self.low):
            val = heapq.heappop(self.high)
            heapq.heappush(self.low, -val)

    def find_median(self):
        if len(self.low) > len(self.high):
            return float(-self.low[0])
        else:
            return (-self.low[0] + self.high[0]) / 2

# Použitie:
finder = MedianFinder()
for num in [5, 15, 1, 3]:
    finder.add_num(num)
    print(finder.find_median())

Táto metóda je efektívna pre spracovanie tokov s obmedzenou pamäťou.