Files
eduplan-cpp-eltex/diag/tasks/11_heap/task.md
T

1.8 KiB
Raw Blame History

Задача 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 отличается от кучи.