ds-kit-js - v1.1.0
    Preparing search index...

    Упорядоченные множества и словари

    Встроенные Set и Map хранят элементы в порядке вставки и не умеют быстро находить минимум, соседей или диапазон. Структуры из этого раздела хранят элементы отсортированными.

    BinarySearchTree, AVLTree и RedBlackTree наследуют BinaryTree и поддерживают одинаковые методы:

    Метод Описание
    insert(v) / delete(v) возвращают true, если дерево изменилось
    has(v), get(v) проверка наличия / получение хранимого элемента
    min(), max() наименьший и наибольший элементы
    floor(v), ceil(v) ближайший элемент ≤ v / ≥ v
    lower(v), higher(v) предыдущий элемент < v / следующий > v
    range(lo, hi) элементы из отрезка [lo, hi] по возрастанию
    inOrder(), preOrder(), postOrder(), levelOrder() четыре вида обхода (итеративные, без рекурсии)
    height() высота дерева
    import { RedBlackTree } from 'ds-kit-js';

    const timestamps = new RedBlackTree([1000, 1500, 2300, 4100]);
    timestamps.floor(2000); // 1500 — последнее событие до 2000
    timestamps.ceil(2000); // 2300 — первое событие после 2000
    timestamps.lower(1500); // 1000 — событие перед 1500
    timestamps.higher(1500); // 2300 — событие после 1500
    [...timestamps.range(1200, 3000)]; // [1500, 2300]

    Классическое двоичное дерево поиска без балансировки. Полезно для изучения и как основа для экспериментов. На отсортированных данных вырождается в список с высотой n.

    Строго сбалансированное дерево: высоты поддеревьев любого узла отличаются не более чем на 1. Поиск в нём быстрее, чем в красно-чёрном дереве, зато вставки и удаления требуют больше поворотов.

    Левостороннее красно-чёрное дерево (LLRB) Роберта Седжвика. Высота не превышает 2·log₂ n. Хороший выбор по умолчанию.

    Вероятностная структура: многоуровневый связный список, в котором каждый уровень «перепрыгивает» через часть элементов. Даёт O(log n) в среднем и поддерживает insert, delete, has, min, max, range.

    import { SkipList } from 'ds-kit-js';

    const scores = new SkipList([40, 10, 30]);
    scores.insert(20);
    [...scores]; // [10, 20, 30, 40]
    [...scores.range(15, 35)]; // [20, 30]

    Третьим аргументом конструктора можно передать собственный генератор случайных чисел, чтобы структура списка была воспроизводимой в тестах.

    Словарь на основе красно-чёрного дерева, ключи которого всегда отсортированы. Интерфейс похож на Map (get, set, has, delete, keys, values, entries), плюс навигация по ключам: firstKey/lastKey, floorKey/ceilKey, lowerKey/higherKey и выборка entriesBetween:

    import { SortedMap } from 'ds-kit-js';

    // Тарифная сетка: найти ставку для суммы
    const rates = new SortedMap<number, number>([
    [0, 0.13],
    [2_400_000, 0.15],
    [5_000_000, 0.18],
    ]);

    const bracket = rates.floorKey(3_000_000); // 2_400_000
    rates.get(bracket!); // 0.15

    [...rates.entriesBetween(0, 3_000_000)]; // [[0, 0.13], [2400000, 0.15]]
    rates.firstKey(); // 0
    rates.lastKey(); // 5000000