Sobes.tech
Back to questions
Middle+
6

Реализуй получение топ-5 сервисов за O(N) с использованием вспомогательной структуры

Companies where asked
X5 groupX5 group

Answer from AI

sobes.tech AI

Для получения топ-5 сервисов за O(N) можно использовать структуру данных "минимальная куча" (min-heap) фиксированного размера 5. Идея в том, чтобы пройтись по всем сервисам один раз, поддерживая в куче текущие топ-5 по нужному критерию (например, по количеству запросов или рейтингу).

Пример на Go:

package main

import (
	"container/heap"
	"fmt"
)

type Service struct {
	Name  string
	Score int
}

type MinHeap []Service

func (h MinHeap) Len() int           { return len(h) }
func (h MinHeap) Less(i, j int) bool { return h[i].Score < h[j].Score }
func (h MinHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

func (h *MinHeap) Push(x interface{}) {
	*h = append(*h, x.(Service))
}

func (h *MinHeap) Pop() interface{} {
	old := *h
	n := len(old)
	item := old[n-1]
	*h = old[0 : n-1]
	return item
}

func Top5Services(services []Service) []Service {
	h := &MinHeap{}
	heap.Init(h)

	for _, s := range services {
		if h.Len() < 5 {
			heap.Push(h, s)
		} else if s.Score > (*h)[0].Score {
			heap.Pop(h)
			heap.Push(h, s)
		}
	}

	// Результат в куче, можно отсортировать по убыванию
	result := make([]Service, h.Len())
	for i := len(result) - 1; i >= 0; i-- {
		result[i] = heap.Pop(h).(Service)
	}
	return result
}

func main() {
	services := []Service{
		{"A", 10}, {"B", 50}, {"C", 30}, {"D", 40}, {"E", 20}, {"F", 60}, {"G", 15},
	}
	top5 := Top5Services(services)
	for _, s := range top5 {
		fmt.Println(s.Name, s.Score)
	}
}

Так мы проходим по массиву один раз (O(N)) и поддерживаем кучу из 5 элементов, что эффективно по времени и памяти.