Middle — Senior
Ինչպե՞ս մշակել տվյալների հոսքը՝ միջին արժեքը հաշվելու համար սահմանափակ հիշողությամբ։
sobes.tech AI
Պատասխան AI-ից
Մեդիան հաշվարկելու համար տվյալների հոսքում սահմանափակ հիշողությամբ օգտագործվում են ալգորիթմներ, որոնք չեն պահանջում պահել բոլոր տարրերը։ Մեկ հայտնի մոտեցում է պահել երկու տվյալների կառուցվածքներ (օրինակ՝ երկու հողեր)
- Մեծագույն հող՝ ստորին կեսի տարրերի համար
- Մինիմալ հող՝ վերին կեսի տարրերի համար
Երբ նոր թիվ է գալիս, այն ավելացվում է մեկ հողում, ապա դրանց չափերը հավասարակշռվում են, որպեսզի տարբերությունը չգերազանցի 1-ը։ Մեդիան այն է՝ կամ մեծագույն հողի արմատը (եթե այն մեծ է), կամ երկու հողերի արմատների միջին արժեքը։
Այս մեթոդը թույլ է տալիս յուրաքանչյուր տարրին հասնել O(log n) ժամանակում և օգտագործել հիշողությունը՝ համեմատաբար մեծ թվով տարրերի, առանց ամբողջ հոսքը պահելու։
Python-ում օրինակ՝
import heapq
class MedianFinder:
def __init__(self):
self.low = [] # մեծագույն հող (հակառակ արժեքներով)
self.high = [] # մինիմալ հող
def add_num(self, num):
heapq.heappush(self.low, -num)
# տեղափոխել ամենամեծը ստորին հողից վերև
if self.low and self.high and (-self.low[0]) > self.high[0]:
val = -heapq.heappop(self.low)
heapq.heappush(self.high, val)
# հավասարակշռել չափերը
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
# Օգտագործում՝
finder = MedianFinder()
for num in [5, 15, 1, 3]:
finder.add_num(num)
print(finder.find_median())
Այս մեթոդը արդյունավետ է սահմանափակ հիշողությամբ տվյալների հոսքերը մշակելու համար։