Хранилище интервалов
От: DTF  
Дата: 26.07.25 18:13
Оценка:
Всем привет.
Нужна помощь коллег.

Я ищу структуру данных, которая хранит в себе диапазоны, задаваемые координатой начала и конца, и поддерживает операции
* добавить диапазон
* удалить диапазон
* Найти все диапазоны, содержащие некоторую точку.


Хотелось бы, чтобы эти операции работали быстрее, чем за линейное время.
Гугл предлагает дерево отрезков, но, если я правильно понимаю, добавление и удаление там в худшем случае будет как раз линейным.

В общем, нужна помощь коллективного разума
Re: Хранилище интервалов
От: LaptevVV Россия  
Дата: 26.07.25 18:23
Оценка:
Дерево отрезков ?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Хранилище интервалов
От: DTF  
Дата: 26.07.25 18:29
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Дерево отрезков ?


Процитирую кусок своего же сообщения

> Гугл предлагает дерево отрезков, но, если я правильно понимаю, добавление и удаление там в худшем случае будет как раз линейным.
Re[2]: Хранилище интервалов
От: Qulac Россия  
Дата: 26.07.25 18:30
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Дерево отрезков ?


Там нет информации о добавленных диапазонах, а я как понял топикастеру это надо.
Программа – это мысли спрессованные в код
Re: Хранилище интервалов
От: σ  
Дата: 26.07.25 19:07
Оценка:
DTF>Я ищу структуру данных, которая хранит в себе диапазоны, задаваемые координатой начала и конца, и поддерживает операции
DTF> * добавить диапазон
DTF> * удалить диапазон
DTF> * Найти все диапазоны, содержащие некоторую точку.

DTF>Хотелось бы, чтобы эти операции работали быстрее, чем за линейное время.


https://en.wikipedia.org/wiki/Interval_tree#Augmented_tree :
> Both insertion and deletion require O ( log ⁡ n ) time, with n being the total number of intervals in the tree prior to the insertion or deletion operation
Re: Хранилище интервалов
От: Великий Мессия google
Дата: 26.07.25 19:16
Оценка: :)
что значит худшее?
дерево всегда логарифм

в бусте по моему что то есть

и вообще
хватит уже решать синкцеловские задачи
Re[2]: Хранилище интервалов
От: DTF  
Дата: 26.07.25 20:15
Оценка:
Здравствуйте, σ, Вы писали:

σ>https://en.wikipedia.org/wiki/Interval_tree#Augmented_tree :

>> Both insertion and deletion require O ( log ⁡ n ) time, with n being the total number of intervals in the tree prior to the insertion or deletion operation

А какая там сложность поиска в случае, когда надо найти все интервалы, в которые входит данная точка?
Если бы был нужен один интервал, то понятно, что логарифм.
Но мне нужны все.

P.S.
Получается, interval tree — это не то же самое, что по-русски дерево отрезков
Re[3]: Хранилище интервалов
От: σ  
Дата: 27.07.25 09:17
Оценка:
DTF>А какая там сложность поиска в случае, когда надо найти все интервалы, в которые входит данная точка?

O(log n + k) для k интервалов

DTF>Получается, interval tree — это не то же самое, что по-русски дерево отрезков


ХЗ, читал CLRS на русском, про аугментированные деревья знаю, про деревья отрезков — чёт не помню
Re[3]: Хранилище интервалов
От: LaptevVV Россия  
Дата: 27.07.25 09:53
Оценка: -1 :)
σ>>https://en.wikipedia.org/wiki/Interval_tree#Augmented_tree :
>>> Both insertion and deletion require O ( log ⁡ n ) time, with n being the total number of intervals in the tree prior to the insertion or deletion operation
DTF>А какая там сложность поиска в случае, когда надо найти все интервалы, в которые входит данная точка?
DTF>Если бы был нужен один интервал, то понятно, что логарифм.
DTF>Но мне нужны все.
Ну, очевидно же: n log n
Но, наверное, еще зависит от того, что ты с ними делать будешь ?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Хранилище интервалов
От: DTF  
Дата: 27.07.25 10:03
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Ну, очевидно же: n log n


Ну и зачем она тогда тут? Мне нужно быстрее чем за линейное
Отредактировано 27.07.2025 10:18 DTF . Предыдущая версия .
Re[4]: Хранилище интервалов
От: σ  
Дата: 27.07.25 10:32
Оценка: +1
σ>>>https://en.wikipedia.org/wiki/Interval_tree#Augmented_tree :
>>>> Both insertion and deletion require O ( log ⁡ n ) time, with n being the total number of intervals in the tree prior to the insertion or deletion operation
DTF>>А какая там сложность поиска в случае, когда надо найти все интервалы, в которые входит данная точка?
DTF>>Если бы был нужен один интервал, то понятно, что логарифм.
DTF>>Но мне нужны все.
LVV>Ну, очевидно же: n log n

Откуда очевидно? Даже если всё дерево обходить и проверять каждый интервал, то это O(n)
Re[5]: Хранилище интервалов
От: Великий Мессия google
Дата: 27.07.25 10:46
Оценка:
Здравствуйте, σ, Вы писали:

σ>>>>https://en.wikipedia.org/wiki/Interval_tree#Augmented_tree :

>>>>> Both insertion and deletion require O ( log ⁡ n ) time, with n being the total number of intervals in the tree prior to the insertion or deletion operation
DTF>>>А какая там сложность поиска в случае, когда надо найти все интервалы, в которые входит данная точка?
DTF>>>Если бы был нужен один интервал, то понятно, что логарифм.
DTF>>>Но мне нужны все.
LVV>>Ну, очевидно же: n log n

σ>Откуда очевидно? Даже если всё дерево обходить и проверять каждый интервал, то это O(n)


если обходить все дерево
то зачем здесь дерево?
дерево за тем и нужно, что бы обходить его за логарифм
Re: Хранилище интервалов
От: bnk СССР http://unmanagedvisio.com/
Дата: 27.07.25 12:21
Оценка:
Здравствуйте, DTF, Вы писали:

DTF>Гугл предлагает дерево отрезков, но, если я правильно понимаю, добавление и удаление там в худшем случае будет как раз линейным.


Спрашивай лучше Клода, он намного больше в программировании прошарен

Ваша задача — эффективно хранить диапазоны (отрезки) и быстро выполнять:

добавление диапазона,
удаление диапазона,
поиск всех диапазонов, содержащих точку.
Дерево отрезков (segment tree) действительно не всегда эффективно для динамического добавления/удаления произвольных диапазонов. Для вашей задачи лучше подойдут следующие структуры данных:

1. Interval Tree (интервальное дерево)
Основано на сбалансированном дереве поиска (например, AVL или красно-черное дерево).
Каждый узел хранит диапазон и максимальное значение конца в поддереве.
Операции:
Добавление/удаление диапазона: O(log n)
Поиск всех диапазонов, содержащих точку: O(log n + k), где k — число найденных диапазонов.

2. Segment Tree с динамическими списками
Можно реализовать динамическое дерево отрезков, где в каждом узле хранятся списки диапазонов, полностью покрывающих этот узел.
Добавление/удаление: O(log n + k)
Поиск: O(log n + k)

3. Augmented BST (например, Order Statistic Tree)
Можно хранить интервалы в сбалансированном BST, дополнительно поддерживая максимум конца в поддереве.

Рекомендация
Для вашей задачи классическим и хорошо изученным решением является интервальное дерево (interval tree).
Оно поддерживает все нужные операции быстрее, чем за линейное время.

Отредактировано 27.07.2025 12:31 bnk . Предыдущая версия . Еще …
Отредактировано 27.07.2025 12:26 bnk . Предыдущая версия .
Отредактировано 27.07.2025 12:22 bnk . Предыдущая версия .
Re: Хранилище интервалов
От: tryAnother  
Дата: 27.07.25 12:34
Оценка:
Здравствуйте, DTF, Вы писали:

DTF>Всем привет.

DTF>Нужна помощь коллег.

DTF>Я ищу структуру данных, которая хранит в себе диапазоны, задаваемые координатой начала и конца, и поддерживает операции

DTF> * добавить диапазон
DTF> * удалить диапазон
DTF> * Найти все диапазоны, содержащие некоторую точку.


DTF>Хотелось бы, чтобы эти операции работали быстрее, чем за линейное время.

DTF>Гугл предлагает дерево отрезков, но, если я правильно понимаю, добавление и удаление там в худшем случае будет как раз линейным.

DTF>В общем, нужна помощь коллективного разума


Можно посмотреть на R-tree.
Есть реализация в sqlite (1, 2х и тд мерные) так что можно прикинуть скорость работы в конкретном случае.
Есть и специализированные библиотеки.
Re[2]: Хранилище интервалов
От: DTF  
Дата: 27.07.25 14:00
Оценка:
Здравствуйте, bnk, Вы писали:


bnk>Поиск всех диапазонов, содержащих точку: O(log n + k), где k — число найденных диапазонов.


Вот я не понимаю, откуда там O(log n + k) ?
Re[3]: Хранилище интервалов
От: bnk СССР http://unmanagedvisio.com/
Дата: 27.07.25 14:17
Оценка:
Здравствуйте, DTF, Вы писали:

bnk>>Поиск всех диапазонов, содержащих точку: O(log n + k), где k — число найденных диапазонов.


DTF>Вот я не понимаю, откуда там O(log n + k) ?


Из Википедии я думаю, но могу спросить, у меня самого моск уже фсе, атрофировался, я теперь стратегией занимаюсь, как тот филин из анекдота
Отредактировано 27.07.2025 14:19 bnk . Предыдущая версия .
Re[3]: Хранилище интервалов
От: σ  
Дата: 27.07.25 16:59
Оценка:
DTF>Вот я не понимаю, откуда там O(log n + k) ?

Если всего один интервал, до него надо спуститься, а это в худшем случае h = log n для ±сбалансированных деревьев
А идти по дереву (влево, если ещё внутри левой границы, и вправо, если внутри максимальной правой) и обрабатывать все подходящие k интервалов — это k

Примерно так можно почувствовать

Ну и оценка — верхняя. Если все интервалы подходят, то сложность не C1*n + C2*log n,, а просто C1*n
Re[4]: Хранилище интервалов
От: DTF  
Дата: 27.07.25 18:31
Оценка: :)
Здравствуйте, σ, Вы писали:

σ>Если всего один интервал, до него надо спуститься, а это в худшем случае h = log n для ±сбалансированных деревьев

σ>А идти по дереву (влево, если ещё внутри левой границы, и вправо, если внутри максимальной правой) и обрабатывать все подходящие k интервалов — это k

σ>Примерно так можно почувствовать


Если все интервалы, то мы спускаемся влево за логарифм, как уже написали, и вправо.
Но вправо — это тоже логарифм, разве нет?

Т.е. чтобы найти каждый интервал, нам надо погулять по дереву.
Это k*log(n) вроде бы
Re[5]: Хранилище интервалов
От: σ  
Дата: 27.07.25 19:10
Оценка:
DTF>Т.е. чтобы найти каждый интервал, нам надо погулять по дереву.
DTF>Это k*log(n) вроде бы

k*log(n) было бы если бы спускались каждый раз от корня и возвращались назад в корень после нахождения очередного интервала, и потом спускались до следующего
Re[2]: Хранилище интервалов
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.07.25 23:07
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

ВМ>что значит худшее?

ВМ>дерево всегда логарифм

Сбалансированное.

Связанный список — тоже дерево. Но только ветка у него только одна. Но зато длинная.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.