1.8 KiB
1.8 KiB
Задача 11 — куча: построение за O(n) и top-K (C++)
Куча max-heap в массиве (для элемента i дети — 2i+1, 2i+2), без std::priority_queue.
void heapify(std::vector<int>& a); // перестроить массив в кучу
int kth_largest(const std::vector<int>& a, int k); // k >= 1
std::vector<int> top_k(const std::vector<int>& a, int k); // k наибольших, по убыванию
Требования:
heapify— просеивание снизу вверх (bottom-up), O(n), а неpushв цикле (это O(n log n)); проверка свойств кучи машинная, требование по сложности я сверяю глазами по коду — на собеседовании спросят именно это;heapifyобязан сохранить мультимножество элементов (ничего не терять и не дублировать);kв границах1..n; приk > n—top_kвозвращает все по убыванию,kth_largestприk > nвозвращает значение минимального элемента (то есть не падает);- 3 000 000 элементов:
heapifyбыстрее 2 секунд,kth_largestсk = 1000быстрее 2 секунд.
Проверка: python3 grade.py 11. Критерий: все ok, сборка без предупреждений,
ASAN/UBSAN чистые.
Разбор после сдачи: почему снизу вверх выходит сумма геометрической прогрессии; когда
нужен min-heap размера k (top-K на потоке); чем nth_element отличается от кучи.