std.container.rbtree
В этом модуле реализован контейнер красно-чёрного дерева.
Этот модуль является подмодулем std.container.
- Исходный код
- std/container/rbtree.d
- Лицензия:
- Распространяется по лицензии Boost Software License, версия 1.0. (См. прилагаемый файл LICENSE_1_0.txt или копию на boost.org/LICENSE_1_0.txt).
- Авторы:
- Steven Schveighoffer, Andrei Alexandrescu
- Примеры:
-
import std.algorithm.comparison : equal; import std.container.rbtree; auto rbt = redBlackTree(3, 1, 4, 2, 5); writeln(rbt.front); // 1 assert(equal(rbt[], [1, 2, 3, 4, 5])); rbt.removeKey(1, 4); assert(equal(rbt[], [2, 3, 5])); rbt.removeFront(); assert(equal(rbt[], [3, 5])); rbt.insert([1, 2, 4]); assert(equal(rbt[], [1, 2, 3, 4, 5])); // Query bounds in O(log(n)) assert(rbt.lowerBound(3).equal([1, 2])); assert(rbt.equalRange(3).equal([3])); assert(rbt.upperBound(3).equal([4, 5])); // A Red Black tree with the highest element at front: import std.range : iota; auto maxTree = redBlackTree!"a > b"(iota(5)); assert(equal(maxTree[], [4, 3, 2, 1, 0])); // adding duplicates will not add them, but return 0 auto rbt2 = redBlackTree(1, 3); writeln(rbt2.insert(1)); // 0 assert(equal(rbt2[], [1, 3])); writeln(rbt2.insert(2)); // 1 // however you can allow duplicates auto ubt = redBlackTree!true([0, 1, 0, 1]); assert(equal(ubt[], [0, 0, 1, 1]));
- class RedBlackTree(T, alias less = "a < b", bool allowDuplicates = false) if (is(typeof(binaryFun!less(T.init, T.init))));
-
Реализация контейнера красно-чёрного дерева.
Все операции вставки, удаления, поиска и любые функции в целом имеют сложность Ο(
lg(n)).
Чтобы использовать сравнение отличное от"a < b", передайте другую строку оператора, которая может быть использованаstd.functional.binaryFun, или передайте функцию, делегат, функтор или любой тип, гдеless(a, b)приводит к значениюbool.
Обратите внимание, что less должно обеспечивать строгое упорядочение. То есть, для двух неравных элементовaиb,less(a, b) == !less(b, a).less(a, a)всегда должно быть равноfalse.
ЕслиallowDuplicatesустановлено в значениеtrue, то вставка одного и того же элемента более одного раза продолжает добавлять больше элементов. Если этоfalse, дубликаты элементов игнорируются при вставке. Если дубликаты разрешены, то новые элементы вставляются после всех существующих дубликатов.- alias Elem = T;
-
Тип элемента для дерева
- alias Range = RBRange!(RBNode*);
alias ConstRange = RBRange!(const(RBNode)*);
alias ImmutableRange = RBRange!(immutable(RBNode)*); -
Типы диапазонов для
RedBlackTree - const @property bool empty();
-
Проверка, существуют ли какие-либо элементы в контейнере. Возвращает
falseесли хотя бы один элемент существует. - const @property size_t length();
-
Возвращает количество элементов в контейнере.
- Сложность
- Ο(
1).
- @property RedBlackTree dup();
-
Создать копию этого контейнера. Результирующий контейнер содержит поверхностную копию элементов.
- Сложность
- Ο(
n)
- Range opSlice();
const ConstRange opSlice();
immutable ImmutableRange opSlice(); -
Получение диапазона, охватывающего все элементы в контейнере.
- Сложность
- Ο(
1)
- inout inout(Elem) front();
-
Первый элемент в контейнере
- Сложность
- Ο(
1)
- inout inout(Elem) back();
-
Последний элемент в контейнере
- Сложность
- Ο(
log(n))
- const bool opBinaryRight(string op)(Elem e)
Constraints: if (op == "in"); -
Оператор
in. Проверка наличия заданного элемента в контейнере.- Сложность
- Ο(
log(n))
- bool opEquals(Object rhs);
-
Сравнение двух деревьев на равенство.
- Сложность
- Ο(
n)
- nothrow @safe size_t toHash();
-
Генерирует хеш для дерева. Обратите внимание, что с пользовательской функцией сравнения может не выполняться условие, что если два rbtree равны, то хеши деревьев будут равны.
- void clear();
-
Удаляет все элементы из контейнера.
- Сложность
- Ο(
1)
- size_t stableInsert(Stuff)(Stuff stuff)
Constraints: if (isImplicitlyConvertible!(Stuff, Elem)); -
Вставка одного элемента в контейнер. Обратите внимание, что это не делает недействительными любые текущие итерации контейнера.
- Возвращает:
- Количество добавленных элементов.
- Сложность
- Ο(
log(n))
- size_t stableInsert(Stuff)(scope Stuff stuff)
Constraints: if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem));
alias insert = stableInsert; -
Вставка диапазона элементов в контейнер. Обратите внимание, что это не делает недействительными любые текущие итерации контейнера.
- Возвращает:
- Количество добавленных элементов.
- Сложность
- Ο(
m * log(n))
- Elem removeAny();
-
Удаление элемента из контейнера и возврат его значения.
- Сложность
- Ο(
log(n))
- void removeFront();
-
Удаление первого элемента из контейнера.
- Сложность
- Ο(
log(n))
- void removeBack();
-
Удаление последнего элемента из контейнера.
- Сложность
- Ο(
log(n))
- Range remove(Range r);
-
Удаление заданного диапазона из контейнера.
- Возвращает:
- Диапазон, содержащий все элементы, которые были после данного диапазона.
- Сложность
- Ο(
m * log(n)) (где m - количество элементов в диапазоне)
- Range remove(Take!Range r);
-
Удаление заданного
Take!Rangeиз контейнера- Возвращает:
- Диапазон, содержащий все элементы, которые были после данного диапазона.
- Сложность
- Ο(
m * log(n)) (где m - количество элементов в диапазоне)
- size_t removeKey(U...)(U elems)
Constraints: if (allSatisfy!(isImplicitlyConvertibleToElem, U));
size_t removeKey(U)(scope U[] elems)
Constraints: if (isImplicitlyConvertible!(U, Elem));
size_t removeKey(Stuff)(Stuff stuff)
Constraints: if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem) && !isDynamicArray!Stuff); -
Удаляет элементы из контейнера, равные заданным значениям согласно компаратору less. Один элемент удаляется для каждого заданного значения, которое присутствует в контейнере. Если
allowDuplicatesистинно, дубликаты удаляются только если даны дубликаты значений.- Возвращает:
- Количество удаленных элементов.
- Сложность
- Ο(
m log(n)) (где m - количество элементов для удаления)
- Пример
auto rbt = redBlackTree!true(0, 1, 1, 1, 4, 5, 7); rbt.removeKey(1, 4, 7); assert(equal(rbt[], [0, 1, 1, 5])); rbt.removeKey(1, 1, 0); assert(equal(rbt[], [5]));
- Range upperBound(Elem e);
const ConstRange upperBound(Elem e);
immutable ImmutableRange upperBound(Elem e); -
Получить диапазон из контейнера со всеми элементами, которые > e согласно компаратору less
- Сложность
- Ο(
log(n))
- Range lowerBound(Elem e);
const ConstRange lowerBound(Elem e);
immutable ImmutableRange lowerBound(Elem e); -
Получить диапазон из контейнера со всеми элементами, которые < e согласно компаратору less
- Сложность
- Ο(
log(n))
- auto equalRange(this This)(Elem e);
-
Получить диапазон из контейнера со всеми элементами, которые == e согласно компаратору less
- Сложность
- Ο(
log(n))
- const void toString(scope void delegate(const(char)[]) sink, ref scope const FormatSpec!char fmt);
-
Форматирует RedBlackTree в функцию-приёмник. Для получения более подробной информации см.
std.format.formatValue. Обратите внимание, что это доступно только когда тип элемента может быть отформатирован. В противном случае используется стандартный toString из Object. - this(Elem[] elems...);
-
Конструктор. Передайте массив элементов или отдельные элементы для инициализации дерева.
- this(Stuff)(Stuff stuff)
Constraints: if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem)); -
Конструктор. Передайте диапазон элементов для инициализации дерева.
- this();
- auto redBlackTree(E)(E[] elems...);
auto redBlackTree(bool allowDuplicates, E)(E[] elems...);
auto redBlackTree(alias less, E)(E[] elems...)
Constraints: if (is(typeof(binaryFun!less(E.init, E.init))));
auto redBlackTree(alias less, bool allowDuplicates, E)(E[] elems...)
Constraints: if (is(typeof(binaryFun!less(E.init, E.init))));
auto redBlackTree(Stuff)(Stuff range)
Constraints: if (isInputRange!Stuff && !isArray!Stuff);
auto redBlackTree(bool allowDuplicates, Stuff)(Stuff range)
Constraints: if (isInputRange!Stuff && !isArray!Stuff);
auto redBlackTree(alias less, Stuff)(Stuff range)
Constraints: if (is(typeof(binaryFun!less((ElementType!Stuff).init, (ElementType!Stuff).init))) && isInputRange!Stuff && !isArray!Stuff);
auto redBlackTree(alias less, bool allowDuplicates, Stuff)(Stuff range)
Constraints: if (is(typeof(binaryFun!less((ElementType!Stuff).init, (ElementType!Stuff).init))) && isInputRange!Stuff && !isArray!Stuff); -
Функция для создания
RedBlackTree!Eиз списка значений.- Параметры:
allowDuplicates Разрешить дубликаты (необязательно, по умолчанию: false) less предикат для сортировки (необязательно) E[] elemsэлементы для вставки в rbtree (переменное число аргументов) Stuff rangeдиапазон элементов для вставки в rbtree (альтернатива elems)
- Примеры:
-
import std.range : iota; auto rbt1 = redBlackTree(0, 1, 5, 7); auto rbt2 = redBlackTree!string("hello", "world"); auto rbt3 = redBlackTree!true(0, 1, 5, 7, 5); auto rbt4 = redBlackTree!"a > b"(0, 1, 5, 7); auto rbt5 = redBlackTree!("a > b", true)(0.1, 1.3, 5.9, 7.2, 5.9); // also works with ranges auto rbt6 = redBlackTree(iota(3)); auto rbt7 = redBlackTree!true(iota(3)); auto rbt8 = redBlackTree!"a > b"(iota(3)); auto rbt9 = redBlackTree!("a > b", true)(iota(3));
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_container_rbtree.html