|
|
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
Задача теоритеческая: пусть имеется массив из N интервалов заданных начальной и конечной границей. Необходимо найти алгоритм с минималной алгоритмической сложностью, который находит все интервалы, которые включают в себя заданную точку. О интервалах ничего заранее не известно. Перед поиском можно предварително обработать массив. Инетересует есть ли что-нибудь быстрее чем O(N) и что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 17:02 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
Если отсортировать по началам отрезков, то можно перебор с начала массива и остановится как только начало > искомой точки. Немного быстрее O(N) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 17:09 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
А если отсортировать отрезки а потом искать методом половинного деления, то можно сократить O(log n) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 17:22 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
Dima TЕсли отсортировать по началам отрезков, то можно перебор с начала массива и остановится как только начало > искомой точки. Немного быстрее O(N) Это оптимзация не изменяет алгоритмическую сложнось, но на практике конечно плюс. А можно ещё быстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 17:23 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
Dima TЕсли отсортировать по началам отрезков, какова трудоёмкость сортировки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 17:24 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
White OwlА если отсортировать отрезки а потом искать методом половинного деления, то можно сократить O(log n) отсортировать отрезки по какому критерию? Если по началу интервала то быстрее не будет, потому что нужно будет проверить 1/2 * N интервалов на вхождение. O(C*N) = O(N) В вашем случае C = 1/2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 17:26 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
mikron, Может помочь R-Tree-индекс (Spatial index), насколько я помню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 17:27 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
ИзопропилDima TЕсли отсортировать по началам отрезков, какова трудоёмкость сортировки? Стоимость предварителной обработки не учитывается. Это в условии задачи оговорено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 17:28 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
R-Tree не подойдут: во первых не мнгомерные данные. Во вторых нужно найти все интервалы а не один. А вот это похоже годится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 17:44 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
mikronСтоимость предварителной обработки не учитывается. Это в условии задачи оговорено. В таком случае можно в качестве предобработки поделить весь интервал, покрываемый этими интервалами (min(start)...max(end)) на набор непрерывных отрезков, и составить таблицу, располагается ли конкретный частный интервал на каждом из отрезков, с градацией полностью/частично. Тогда по заданной координате половинным делением получаем сразу список частных интервалов, которые следует проверять на попадание в них точки (те, что частично), и список тех, в которые точка гарантированно попадает (те, что полностью). Думать, на какое количество отрезков оптимально рубить диапазон, лениво... тем более думать о том, что в оптимуме они могут быть неравными по размеру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 18:04 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
mikronR-Tree не подойдут: во первых не мнгомерные данные. Во вторых нужно найти все интервалы а не один."Много" легко сводится к одному. И все интервалы вполне себе ищутся. В некоторых СУБД уже готовая механика для этого есть, например, в MySQL в движке MyISAM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 18:37 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
AkinaДумать, на какое количество отрезков оптимально рубить диапазон, лениво... тем более думать о том, что в оптимуме они могут быть неравными по размеру.Так прям по списку вершин и рубить. Будет порядка 2N интервалов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 18:39 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
mikronWhite OwlА если отсортировать отрезки а потом искать методом половинного деления, то можно сократить O(log n) отсортировать отрезки по какому критерию? По началам или концам, не важно. Главное чтобы можно было сказать: вот это граничный элемент и все элементы левее него не удовлетворяют". mikronЕсли по началу интервала то быстрее не будет, потому что нужно будет проверить 1/2 * N интервалов на вхождение. O(C*N) = O(N) В вашем случае C = 1/2Ну.... да с я поторопился. Но в общем, если начать с бинарного поиска, то получится: на поиск любого удовлетворяющего отрезка по критерию одного конца. И потом проход влево и вправо от него для поиска остальных интервалов. И это уже будет ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 18:48 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
А еще можно сократить исходный массив. В основном массиве оставляем отрезки с уникальными началами и минимальными концами. И к каждому элементу привязываем дополнительный массив в который скидываем все отрезки у которых такие-же начала, но которые более длинные. Тогда будет достаточно найти все "минимальные" отрезки и автоматом взять все привязанные к ним более длинные отрезки. Суммарная сложность поиска все равно O(N) останется, но если в исходном наборе было много отрезков с повторяющимися началами - может хорошо ускорить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 19:02 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
White OwlА еще можно сократить исходный массив. В основном массиве оставляем отрезки с уникальными началами и минимальными концами. И к каждому элементу привязываем дополнительный массив в который скидываем все отрезки у которых такие-же начала, но которые более длинные. Тогда будет достаточно найти все "минимальные" отрезки и автоматом взять все привязанные к ним более длинные отрезки. Суммарная сложность поиска все равно O(N) останется, но если в исходном наборе было много отрезков с повторяющимися началами - может хорошо ускорить.Не, соврал опять. Не самые минимальные надо оставлять в основном массиве, а такие чтобы обеспечивали непрерывное покрытие всего диапазона. И те которые меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 19:06 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
miksoftmikronR-Tree не подойдут: во первых не мнгомерные данные. Во вторых нужно найти все интервалы а не один."Много" легко сводится к одному. И все интервалы вполне себе ищутся. В некоторых СУБД уже готовая механика для этого есть, например, в MySQL в движке MyISAM. Объясните пожалуйста, как должен работатъ алгоритм поиска всех интервалов на одномерном R+-Tree. Так-же интересно, какое преимущество даёт использование вырожденного R+ дерева по сравнению c B+ деревом для данной задачи. И пожалуйста конструктивно, без лозунгов и словоблудия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 23:07 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
По приведённой мной ссылке пока лучший алгоритм O(log n + m) Там же указывает что для дискретного случая известен алгоритм O(1 + m) Странно что неизвестно подобного для общего случая со сложностью O(1 + m) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 23:20 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
mikronИнетересует есть ли что-нибудь быстрее чем O(N) и что. напрямую зависит от границ интервалов, ограничения на начальную инициализацию и языка. а то ведь можно инициализировать по адресуемой памяти (со смещением) заранее.и задача сведется к обращению по адресу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 23:38 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
mikronЗадача теоритеческая "Решение существует" - воскликнет математик/физик. Потому программирование - ПРИКЛАДНАЯ математика. Исходя из ограничений решение надо искать, а не теоретическое. В теории может быть всё плохо, а на практике - прекрасно. И наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2015, 23:50 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
mikronWhite OwlА если отсортировать отрезки а потом искать методом половинного деления, то можно сократить O(log n) отсортировать отрезки по какому критерию? Если по началу интервала то быстрее не будет, потому что нужно будет проверить 1/2 * N интервалов на вхождение. O(C*N) = O(N) В вашем случае C = 1/2 2 вложенных сортировки 1 по началу отрезка 2 внутри сортировки по началу, отсортировать по убыванию длины. Сохранить точки в которых длина увеличиватеся в порядке сортировки по началу в отдельном списке. Путем вычитания проверяем вхождение. Как только в диапазон не попадаем переходим к следующей точке с большей длиной. Некоторые наборы диапазонов могут потребовать другой сортировки, сначала сортируем по длине, внутренюю сортирорвку делаем по точке начала. Приблизительно так..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2015, 11:22 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
ДохтаРmikronпропущено... отсортировать отрезки по какому критерию? Если по началу интервала то быстрее не будет, потому что нужно будет проверить 1/2 * N интервалов на вхождение. O(C*N) = O(N) В вашем случае C = 1/2 2 вложенных сортировки 1 по началу отрезка 2 внутри сортировки по началу, отсортировать по убыванию длины. Сохранить точки в которых длина увеличиватеся в порядке сортировки по началу в отдельном списке. Путем вычитания проверяем вхождение. Как только в диапазон не попадаем переходим к следующей точке с большей длиной. Некоторые наборы диапазонов могут потребовать другой сортировки, сначала сортируем по длине, внутренюю сортирорвку делаем по точке начала. Приблизительно так..... Первый вариант сортировок годится если имеет много диапазонов с одинаковым началом но разной длиной. Второй вариант , сначала по длине внутри по точке начала для случаев равномерного распределения. Второй варинат сортировки по длине думаю будет оптимальнее по производительности на среднепотолочныз отрезках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2015, 11:35 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
miksoftВ некоторых СУБД уже готовая механика для этого есть, например, в MySQL в движке MyISAM. Подскажи как конкретно эта механика называется. Почитаю. Нагуглить не получилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2015, 11:49 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
Dima TmiksoftВ некоторых СУБД уже готовая механика для этого есть, например, в MySQL в движке MyISAM. Подскажи как конкретно эта механика называется. Почитаю. Нагуглить не получилось. FAQ: Нахождение записей, где заданное значение находится между значениями полей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2015, 12:13 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
AkinamikronСтоимость предварителной обработки не учитывается. Это в условии задачи оговорено. В таком случае можно в качестве предобработки поделить весь интервал, покрываемый этими интервалами (min(start)...max(end)) на набор непрерывных отрезков, и составить таблицу, располагается ли конкретный частный интервал на каждом из отрезков, с градацией полностью/частично. Тогда по заданной координате половинным делением получаем сразу список частных интервалов, которые следует проверять на попадание в них точки (те, что частично), и список тех, в которые точка гарантированно попадает (те, что полностью). Думать, на какое количество отрезков оптимально рубить диапазон, лениво... тем более думать о том, что в оптимуме они могут быть неравными по размеру. А если длину каждого отрезка устремить к нулю(ведь объем предварительных расчётов нас не волнует), то результирующая асимптотика будет O(1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2015, 13:09 |
|
||
|
Быстрый поиск интервалов, в котором наводится точка.
|
|||
|---|---|---|---|
|
#18+
miksoft FAQ: Нахождение записей, где заданное значение находится между значениями полей Спасибо за ссылку. В форум по MySQL не догадался заглянуть. В MSSQL тоже есть что-то похожее . SashaMercuryА если длину каждого отрезка устремить к нулю(ведь объем предварительных расчётов нас не волнует), то ... ... то объем метаданных устремится в бесконечность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2015, 13:53 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39055462&tid=1340927]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
54ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 362ms |

| 0 / 0 |
