Назад к вопросам
X5 group
Middle+
7
Реализуй получение топ-5 сервисов за O(N) с использованием вспомогательной структуры
Компании, где спрашивали
Ответ от нейросети
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 элементов, что эффективно по времени и памяти.