25 lines
1.8 KiB
Markdown
25 lines
1.8 KiB
Markdown
# Задача 11 — куча: построение за O(n) и top-K (C++)
|
||
|
||
Куча **max-heap** в массиве (для элемента `i` дети — `2i+1`, `2i+2`), без `std::priority_queue`.
|
||
|
||
```c++
|
||
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` отличается от кучи.
|