
200 000 объектов за 2 мс: как выбирать топ-K без полной сортировки
arhip1986 7 минут назад 200 000 объектов за 2 мс: как выбирать топ-K без полной сортировки 8 мин 289 .NET * C# * Разработка игр * Алгоритмы * Туториал В real-time играх и серверах часто возникает задача: из N объектов...
В сфере искусственного интеллекта произошло заметное событие. arhip1986 7 минут назад 200 000 объектов за 2 мс: как выбирать топ-K без полной сортировки 8 мин 289 . NET * C# * Разработка игр * Алгоритмы * Туториал В real-time играх и серверах часто возникает задача: из N объектов нужно выбрать K лучших, чтобы обновить их в этом кадре. AI для NPC: из 50 000 врагов обновить только 1000 самых важных.
Анимации: из 10 000 персонажей показать детальные анимации только для 200 ближайших к камере. VFX: из 5000 частиц обновить только те, что в поле зрения. Сетка LOD: из 100 000 объектов выбрать 5000 для высокого качества.
Технические детали
Типичный подход — посчитать оценку для каждого объекта, затем отсортировать весь массив и взять первые K элементов. // Наивный подход: полная сортировка float scores = new float; for (int i = 0; i < N; i++) scores = Dot(features, weights); Array. Sort(scores, ids); // O(N log N) // Берём первые KПроблема: сортировка 200 000 элементов занимает ~16 мс.
Это весь бюджет кадра при 60 FPS. А ведь ещё нужно рендерить, обрабатывать физику, тикать AI. Почему полная сортировка — это переборСложность O(N log N).
Для N = 200 000 это примерно 200 000 × 18 = 3. Плюс аллокации временных массивов. А вам нужно всего K = 2000 элементов.
Отраслевые последствия
Вы выбрасываете 198 000 отcортированных элементов. Это 99% потраченной работы впустую. Дополнительная проблема: групповые квотыЧасто нужно не просто топ-K, а справедливое распределение между группами:Анимации: не более 200 объектовAI: не более 500 объектовVFX: не более 300 объектовФизика: не более 200 объектовСумма квот = K = 1200.
Но если отсортировать общий список, одна группа (например, враги) может занять все топ-1200 мест, а другие группы (союзники, нейтралы) не получат ничего. Правильное решение: отобрать топ-K с учётом квот на группу. Но как это сделать без многократной сортировки?
Решение: SIMD + селекция без полной сортировкиGameBudget. Net — библиотека для . 0+, которая решает обе задачи:Топ-K через heap-селекцию: O(N log K) вместо O(N log N)Групповые квоты через per-group heap: O(N log qᵍ) (где qᵍ — квота группы)SIMD-умножение матриц для скоринга через SlidingRank.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





