Переместиться к: RedBlackTree · redBlackTree
Исходный код: std/container/rbtree.d
import std.container.rbtree; import std.algorithm.comparison : equal; auto rbt = redBlackTree(3, 1, 4, 2, 5); assert(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])); // Запрос ограничивается в пределах O(log(n)) assert(rbt.lowerBound(3).equal([1, 2])); assert(rbt.equalRange(3).equal([3])); assert(rbt.upperBound(3).equal([4, 5])); // Красно-черное дерево с наибольшим элементом спереди: import std.range : iota; auto maxTree = redBlackTree!"a > b"(iota(5)); assert(equal(maxTree[], [4, 3, 2, 1, 0])); // добавление дубликатов не добавит их, но возвращается 0 auto rbt2 = redBlackTree(1, 3); assert(rbt2.insert(1) == 0); assert(equal(rbt2[], [1, 3])); assert(rbt2.insert(2) == 1); // тем не менее, вы можете разрешить дубликаты auto ubt = redBlackTree!true([0, 1, 0, 1]); assert(equal(ubt[], [0, 0, 1, 1]));
Переместиться к: back · clear · ConstRange · dup · Elem · empty · equalRange · front · ImmutableRange · insert · length · lowerBound · opBinaryRight · opEquals · opSlice · Range · remove · removeAny · removeBack · removeFront · removeKey · stableInsert · this · toString · upperBound
RedBlackTree
(T, alias less = "a < b", bool allowDuplicates = false) if (is(typeof(binaryFun!less(T.init, T.init))));
false
.
Если allowDuplicates установлено в true
, то вставка одного и того же элемента несколько раз добавит больше элементов. Если это false
, дублированные элементы игнорируются при вставке. Если дубликаты допускаются, тогда новые элементы включаются после всех существующих дублированных элементов.Elem
= T;
Range
= RBRange!(RBNode*);
ConstRange
= RBRange!(const(RBNode)*);
ImmutableRange
= RBRange!(immutable(RBNode)*);
empty
();
false
, если существует по крайней мере один элемент.length
();
Сложность: Ο(1).
dup
();
Сложность: Ο(n)
opSlice
();
opSlice
();
opSlice
();
Сложность: Ο(1)
front
();
Сложность: Ο(1)
back
();
Сложность: Ο(log(n))
opBinaryRight
(string op)(Elem e
)Сложность: Ο(log(n))
opEquals
(Object rhs
);
Сложность: Ο(n)
clear
();
Сложность: Ο(1)
Переместиться к: 2
stableInsert
(Stuff)(Stuff stuff
)Сложность: Ο(log(n))
stableInsert
(Stuff)(Stuff stuff
)insert
= stableInsert;
Сложность: Ο(m * log(n))
removeAny
();
Сложность: Ο(log(n))
removeFront
();
Сложность: Ο(log(n))
removeBack
();
Сложность: Ο(log(n))
Сложность: Ο(m * log(n)) (где m – это количество элементов в диапазоне)
remove
(Take!Range r
);
Сложность: Ο(m * log(n)) (где m – это количество элементов в диапазоне)
removeKey
(U...)(U elems
)removeKey
(U)(U[] elems
)removeKey
(Stuff)(Stuff stuff
)true
, дубликаты удаляются только в том случае, если даны дублированные значения.
Сложность: Ο(m log(n)) (где m – это количество элементов для удаления)
Example:
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]));
upperBound
(Elem e
);
upperBound
(Elem e
);
upperBound
(Elem e
);
e
в соответствии с компаратором less
Сложность: Ο(log(n))
lowerBound
(Elem e
);
lowerBound
(Elem e
);
lowerBound
(Elem e
);
e
в соответствии с компаратором less
Сложность: Ο(log(n))
equalRange
(this This)(Elem e
);
e
в соответствии с компаратором less
Сложность: Ο(log(n))
toString
(scope void delegate(const(char)[]) sink
, FormatSpec!char fmt
);
sink
. Для более подробной информации, смотрите std.format.formatValue. Заметьте, что это доступно, только когда тип элементов может быть отформатирован. В противном случае, по умолчанию используется toString
от Object.stuff
)redBlackTree
(E)(E[] elems
...);
redBlackTree
(bool allowDuplicates, E)(E[] elems
...);
redBlackTree
(alias less, E)(E[] elems
...)redBlackTree
(alias less, bool allowDuplicates, E)(E[] elems
...)redBlackTree
(Stuff)(Stuff range
)redBlackTree
(bool allowDuplicates, Stuff)(Stuff range
)redBlackTree
(alias less, Stuff)(Stuff range
)redBlackTree
(alias less, bool allowDuplicates, Stuff)(Stuff range
)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); // также работает с диапазонами 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));