Структура данных для хранения диапазонов

Мне интересно, знает ли кто-нибудь о структуре данных, которая бы эффективно справлялась со следующей ситуацией:

Структура данных должна хранить несколько, возможно перекрывающихся диапазонов переменной длины, на некоторой временной шкале времени.

  • Например, вы можете добавить диапазоны a:[0,3], b:[4,7], c:[0,9].

  • Время вставки не должно быть особенно эффективным.

Retrievals будут принимать диапазон в качестве параметра и возвращать все диапазоны в наборе, которые перекрываются с диапазоном, например:

  • Get(1,2) вернет a и c. Get(6,7) вернет b и c. Get(2,6) вернет все три.

  • Ретриенты должны быть максимально эффективными.

Ответ 1

Одной структурой данных, которую вы можете использовать, является одномерный R-tree. Они предназначены для работы с диапазонами и обеспечения эффективного поиска. Вы также узнаете о Allen Operators; существует еще дюжина отношений между временными интервалами, чем просто "перекрытия".

Есть другие вопросы о SO, которые затрагивают эту область, включая:

Ответ 2

Вы можете использовать двоичное дерево, которое хранит диапазоны в иерархии. Начиная с корня node, который представляет собой всеохватывающий диапазон, разделенный на его середину, вы проверяете, будет ли ваш диапазон, который вы пытаетесь вставить, принадлежать левому поддиапазону, правому поддиапазону или и тому и другому, и рекурсивно выполнять в соответствующих поднодах пока вы не достигнете определенной глубины, на которой вы сохраните фактический диапазон.

Для поиска вы проверяете свой диапазон ввода в левом и правом поддиапазонах верхнего node и погружаетесь в те, которые перекрываются, повторяясь, пока вы не достигнете фактических диапазонов, которые вы сохраняете.

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