Sobes.tech
Middle — Senior

Kısıtlı bellek ile medyan hesaplamak için veri akışını nasıl işleriz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Sınırlı bellek ile veri akışında medyanı hesaplamak için tüm öğeleri saklamaya gerek olmayan algoritmalar kullanılır. Popüler yaklaşımlardan biri, iki veri yapısı (örneğin, iki yığın) tutmaktır:

  • Alt yarı için maksimum yığın
  • Üst yarı için minimum yığın

Yeni bir sayı geldiğinde, bunlardan birine eklenir ve ardından yığınların boyutları, en fazla 1 fark olacak şekilde dengelenir. Bu durumda medyan, ya maksimum yığının kökü (eğer daha büyükse) ya da her iki yığının köklerinin ortalaması olur.

Bu yöntem, her öğe için O(log n) zamanla medyanı elde etmeye ve belleği öğe sayısına orantılı kullanmaya olanak tanır, ancak tüm akışı saklamaz.

Python örneği:

import heapq

class MedianFinder:
    def __init__(self):
        self.low = []  # maksimum yığın (değerler ters çevrilmiş)
        self.high = [] # minimum yığın

    def add_num(self, num):
        heapq.heappush(self.low, -num)
        # low'dan yüksek'e en büyük değeri taşı
        if self.low and self.high and (-self.low[0]) > self.high[0]:
            val = -heapq.heappop(self.low)
            heapq.heappush(self.high, val)

        # Boyutları dengele
        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

# Kullanım:
finder = MedianFinder()
for num in [5, 15, 1, 3]:
    finder.add_num(num)
    print(finder.find_median())

Bu yöntem, sınırlı bellek ile akış verilerini etkin şekilde işler.