#Pragma once #include <iostream> #include <vector> template <typename T, typename Comp = std::less<T>> class

Heap {
public:
Heap() = default;

Heap(const std::vector<T>& vector) : body_(vector) {
Heapify();
}

template <typename ...Args>
void emplace(Args&&... args) {
body_.emplace_back(std::forward<Args>(args)...);
SiftUp(body_.size() - 1);
}

void extract_top() {
std::swap(body_.front(), body_.back());
body_.pop_back();
SiftDown(0);
}

const T& get_top() const { return body_.front(); }

private:
void Heapify() {
for (size_t i = body_.size(); i > 0; --i) {
SiftDown(i - 1);
}
}

void SiftUp(size_t index) {
while (index != 0) {
size_t parent = (index - 1) / 2;
if (compare_(body_[index], body_[parent])) {
std::swap(body_[index], body_[parent]);
index = parent;
} else {
break;
}
}
}

void SiftDown(size_t index) {
while (index != body_.size() - 1) {
size_t left_child_index = index * 2 + 1;
size_t right_child_index = left_child_index + 1;
if (left_child_index >= body_.size()) {
return;
}
size_t min_child_index =
(right_child_index < body_.size() &&
!compare_(body_[left_child_index], body_[right_child_index]))
? right_child_index
: left_child_index;
if (!compare_(body_[index], body_[min_child_index])) {
std::swap(body_[index], body_[min_child_index]);
index = min_child_index;
} else {
return;
}
}
}

std::vector<T> body_;
Comp compare_;
};
Народ, насколько плоха такая реализация кучи по скорости? Можно как-то улучшить скорость?

1 ответов

54 просмотра

можно исходники RTOS посмотреть https://freertos.org/a00111.html

Похожие вопросы

Обсуждают сегодня

Всем привет Есть достаточно базовая задача: Дан неориентированный граф. Требуется определить, есть ли в нем цикл, и, если есть, вывести его. Входные данные подаются в виде ма...
Αλeksandr
10
Привет всем. Подскажите, как можно данную задачу более менее эффективно решить? В столовой одного известного Завода вот-вот начнётся обед. На обеде есть три гарнира — макарош...
Vitaliy
6
всем привет. У меня есть неупорядоченный массив точек(в моем случае в трёхмерном пространстве). Есть критерий связанности точек: если евклидово расстояние между ними меньше за...
Павлик Ливаткин
31
Доброе утро. Такой вопрос: есть ли какие-то практически полезные меры вычислительной мощности (в смысле computational complexity) для реальных машин, с ограниченными ресурсам...
Yaroslav Schekin
15
Всем привет Пытаюсь решить следующую задачу: https://informatics.msk.ru/mod/statements/view.php?id=6992&chapterid=101#1 Строка S была записана много раз подряд, после чего из ...
Αλeksandr
10
Здравствуйте. Есть задача нужно найти наименшое число P где фактриал P делиться на 10^N. Ограничения 10^9. Знаю что нужно найти такой P в конце как минимум N нулей. Решение с ...
. Azmiddin
20
Друзья, практический вопрос надо счиать скользящую медиану в последовательности по заданному окну (длины N) тупой вариант - взять значения в окне, отсортировать, взять элеме...
Стас Выщепан
17
Должна-ли работать такая стратегия: Мы каждую секунду бросаем монетку - орел или решка. Если орел - покупаем акцию на все деньги, если у нас есть деньги, или продаем все акци...
George Polevoy
13
Как можно сжимать временные ряды в памяти? У меня есть исторические стоимости ценных бумаг. Данные для каждой минуты в истории OHLC (Open, High, Low, Close). Соответственно, O...
George Polevoy
10
Всем привет Есть задача про интервалы - https://ejudge.lksh.ru/archive/2014/12/Ccpp/day01/01.pdf?ysclid=lhaombs4s4535475456 Думал как решить задачу быстрее, чем за квадрат, но...
Αλeksandr
18
Карта сайта