std.container.binaryheap
Этот модуль предоставляет адаптер BinaryHeap (также известный как очередь с приоритетами), который преобразует произвольный диапазон с произвольным доступом, предоставленный пользователем, в бинарную кучу.
Этот модуль является подмодулем std.container.
- Исходный код
- std/container/binaryheap.d
- Лицензия:
- Распространяется по лицензии Boost Software License, версия 1.0. (См. прилагаемый файл LICENSE_1_0.txt или копию по адресу boost.org/LICENSE_1_0.txt).
- Авторы:
- Andrei Alexandrescu
- Примеры:
-
import std.algorithm.comparison : equal; import std.range : take; auto maxHeap = heapify([4, 7, 3, 1, 5]); assert(maxHeap.take(3).equal([7, 5, 4])); auto minHeap = heapify!"a > b"([4, 7, 3, 1, 5]); assert(minHeap.take(3).equal([1, 3, 4]));
- struct BinaryHeap(Store, alias less = "a < b") if (isRandomAccessRange!Store || isRandomAccessRange!(typeof(Store.init[])));
-
Реализует контейнер бинарной кучи поверх заданного типа диапазона с произвольным доступом (обычно
T[]) или типа контейнера с произвольным доступом (обычноArray!T). В документацииBinaryHeapподлежащий диапазон или контейнер будет называться хранилищем кучи.Бинарная куча накладывает структуру на хранилище, таким образом, доступ к наибольшему элементу (с помощью свойства
front) является операцией Ο(1), а его извлечение (с помощью методаremoveFront()) выполняется быстро за время Ο(log n).
Еслиless– это оператор "меньше", который является значением по умолчанию, тоBinaryHeapопределяет так называемую кучу максимумов, которая оптимизирует извлечение наибольших элементов. Для определения кучи минимумов необходимо создать BinaryHeap с"a > b"в качестве своего предиката.
Простое извлечение элементов из контейнераBinaryHeapравносильно ленивому извлечению элементовStoreв порядке убывания. Извлечение элементов изBinaryHeapдо конца упорядочивает подлежащее хранилище в порядке возрастания, но, опять же, возвращает элементы в порядке убывания.
ЕслиStore— это диапазон, тоBinaryHeapне может превышать размер этого диапазона. ЕслиStore— это контейнер, поддерживающийinsertBack, тоBinaryHeapможет увеличиваться за счёт добавления элементов в контейнер.- Примеры:
- Пример из "Введения в алгоритмы" Кормен и др., стр. 146
import std.algorithm.comparison : equal; int[] a = [ 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 ]; auto h = heapify(a); // largest element writeln(h.front); // 16 // a has the heap property assert(equal(a, [ 16, 14, 10, 8, 7, 9, 3, 2, 4, 1 ]));
- Примеры:
-
BinaryHeapреализует стандартный интерфейс диапазона ввода, позволяя лениво итерироваться по подлежащему диапазону в порядке убывания.import std.algorithm.comparison : equal; import std.range : take; int[] a = [4, 1, 3, 2, 16, 9, 10, 14, 8, 7]; auto top5 = heapify(a).take(5); assert(top5.equal([16, 14, 10, 9, 8]));
- this(Store s, size_t initialSize = size_t.max);
-
Преобразует хранилище
sв кучу. Если указаноinitialSize, только первыеinitialSizeэлементов вsпреобразуются в кучу, после чего куча может увеличиться доr.length(еслиStore— это диапазон) или до бесконечности (еслиStore— это контейнер сinsertBack). Выполняет Ο(min(r.length, initialSize)) оценокless. - void acquire(Store s, size_t initialSize = size_t.max);
-
Принимает хранилище на владение. После этого манипулирование
sможет привести к неправильной работе кучи. - void assume(Store s, size_t initialSize = size_t.max);
-
Принимает хранилище на владение, предполагая, что оно уже организовано как куча.
- auto release();
-
Очищает кучу. Возвращает часть хранилища с
0поlength, которая удовлетворяет свойству кучи. - @property bool empty();
-
Возвращает
true, если куча пустая,falseв противном случае. - @property BinaryHeap dup();
-
Возвращает копию кучи. Метод
dupдоступен только в том случае, если подлежащее хранилище его поддерживает. - @property size_t length();
-
Возвращает длину кучи.
- @property size_t capacity();
-
Возвращает емкость кучи, которая равна длине подлежащего хранилища (если хранилище — диапазон) или емкости подлежащего хранилища (если хранилище — контейнер).
- @property ElementType!Store front();
-
Возвращает копию начала кучи, которая является наибольшим элементом согласно
less. - void clear();
-
Очищает кучу, отсоединив её от подлежащего хранилища.
- size_t insert(ElementType!Store value);
-
Вставляет
valueв хранилище. Если подлежащее хранилище является диапазоном иlength == capacity, генерируется исключение. - void removeFront();
alias popFront = removeFront; -
Удаляет наибольший элемент из кучи.
- ElementType!Store removeAny();
-
Удаляет наибольший элемент из кучи и возвращает его копию. Элемент всё ещё находится в хранилище кучи. По соображениям производительности, возможно, вы захотите использовать
removeFrontс кучами объектов, копирование которых дорогостоящее. - void replaceFront(ElementType!Store value);
-
Заменяет наибольший элемент в хранилище на
value. - bool conditionalInsert(ElementType!Store value);
-
Если у кучи есть место для роста, вставляет
valueв хранилище и возвращаетtrue. В противном случае, еслиless(value, front), вызываетreplaceFront(value)и снова возвращаетtrue. В противном случае, куча остаётся неизменной и возвращаетfalse. Этот метод полезен в сценариях, где необходимо собрать наименьшиеkэлементов из набора кандидатов. - bool conditionalSwap(ref ElementType!Store value);
-
Обмен разрешён, если куча заполнена. Если
less(value, front), метод меняет store.front и value и возвращаетtrue. В противном случае куча остаётся неизменной и возвращаетfalse.
- BinaryHeap!(Store, less) heapify(alias less = "a < b", Store)(Store s, size_t initialSize = size_t.max);
-
Функция-утилита, которая возвращает объект
BinaryHeap!Store, инициализированныйsиinitialSize.- Примеры:
-
import std.conv : to; import std.range.primitives; { // example from "Introduction to Algorithms" Cormen et al., p 146 int[] a = [ 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 ]; auto h = heapify(a); h = heapify!"a < b"(a); writeln(h.front); // 16 writeln(a); // [16, 14, 10, 8, 7, 9, 3, 2, 4, 1] auto witness = [ 16, 14, 10, 9, 8, 7, 4, 3, 2, 1 ]; for (; !h.empty; h.removeFront(), witness.popFront()) { assert(!witness.empty); writeln(witness.front); // h.front } assert(witness.empty); } { int[] a = [ 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 ]; int[] b = new int[a.length]; BinaryHeap!(int[]) h = BinaryHeap!(int[])(b, 0); foreach (e; a) { h.insert(e); } writeln(b); // [16, 14, 10, 8, 7, 3, 9, 1, 4, 2] }
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_container_binaryheap.html