Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Простая задачка с отрезками
|
|||
|---|---|---|---|
|
#18+
Задача: необходимо спроектировать базу данных отрезков на прямой, заданных координатами левого и правого концов (например: [200; 400]), так что бы можно было бы максимально эффективно построить поиск тех для заданной точки (например с координатой 110) найти все отрезки в которых она содержится. Ограничение на число таблиц нет. Какие будут идеи? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 00:37 |
|
||
|
Простая задачка с отрезками
|
|||
|---|---|---|---|
|
#18+
сказать по чести не понял затруднения :) тривиальный подход: делается таблица (левай_граница, правая_граница, вхождение_левой_границы_в_отрезок, вхождение_правой_границы_в_отрезок) и ищется по соотвествующему условию (<,> ...) нетривиальности начинают появляться при нехватки скорости, но для этого надо хотя бы примерно знать количество отрезков... с уважением, Дмитрий Жучков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 07:02 |
|
||
|
Простая задачка с отрезками
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 07:39 |
|
||
|
Простая задачка с отрезками
|
|||
|---|---|---|---|
|
#18+
Lexx_K так что бы можно было бы максимально эффективно построить поиск тех для заданной точки (например с координатой 110) найти все отрезки в которых она содержится. Наверное имеется в виду, что точка лежит на отрезке, а не совпадает с координатами концов. Тогда, ИМХО, ты можеш только отсечь те отрезки в которых она не может находиться по определению - типа лежит левее левой границы. А дальше только перебором по функции, где координаты отрезка и точки - входные параметры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 09:30 |
|
||
|
Простая задачка с отрезками
|
|||
|---|---|---|---|
|
#18+
Серега Наверное имеется в виду, что точка лежит на отрезке, а не совпадает с координатами концов. Тогда, ИМХО, ты можеш только отсечь те отрезки в которых она не может находиться по определению - типа лежит левее левой границы. А дальше только перебором по функции, где координаты отрезка и точки - входные параметры. левее левой... и правее правой :) т.е. :point between lborder and rborder; это-то вроде понятно, другое дело, что если отрезков очень много, то простой перебор может не дать нормального результата по скорости и тогда придётся думать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 10:27 |
|
||
|
Простая задачка с отрезками
|
|||
|---|---|---|---|
|
#18+
Поддерживать в соответствии с таблицей lines( line_id(pk), left_border, rigth_border ) вспомогательные таблицы intervals( interval_id(pk), left_border, right_border ) и interval_lines( interval_id(fk), line_id(fk) ) таким образом, чтобы каждый интервал не содержал концов отрезков, интервалы покрывали бы полностью промежуток от min(lines.left_border) до max(lines.right_border), чтобы кол-во интервалов было бы наименьшим из возможных. Пример: lines: 1,200,400; 2,300,400; 3,300,500; 4,100,300; intervals: 1,100,200; 2,200,300; 3,300,400; 4,400,500; interval_lines: 1,4; 2,1; 2,4; 3,1; 3,2; 3,3; 4,3. Тогда запрос будет примерно таким: select * from lines where line_id in ( select line_id from interval_lines where interval_id in ( select /* этот подзапрос возвращает 1 или 0 строк */ interval_id from ( select * from intervals where $POINT > left_border order by left_border desc limit 1 ) where $POINT < right_border ) ). Нужны индексы intervals(left_border), interval_lines(interval_id[,line_id]), lines(line_id). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 10:55 |
|
||
|
Простая задачка с отрезками
|
|||
|---|---|---|---|
|
#18+
Почитал каменты. Простота спасет мир :) Есть такое понятие как GIS, в котором все извраты с точками и линиями отработаны нормально. Правда не во всех серверах БД. Какой у автора темы сервер БД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 11:13 |
|
||
|
Простая задачка с отрезками
|
|||
|---|---|---|---|
|
#18+
БД - Oracle Интересует как сделать с сублинейными затратами ( меньше O(n) ). Отрезки или интервалы - не важно. Пусть для порядка концы отрезков будут пренадлежать отрезкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 11:42 |
|
||
|
Простая задачка с отрезками
|
|||
|---|---|---|---|
|
#18+
Lexx_KБД - Oracle Интересует как сделать с сублинейными затратами ( меньше O(n) ). Отрезки или интервалы - не важно. Пусть для порядка концы отрезков будут пренадлежать отрезкам. В Oracle Spatial используется примерно тоже, что предложил LeXa NalBat. Сначала всё пространстро разбиваем на небольшое количество одинаковых прямоугольных областей. Локализуем область и объекты, которые в ней находятся, ищем среди этих объектов. Проблема с поиском отрезков в том, что если искать по индексу по полю с координатой начала отрезка, то мы можем сразу отсечь только те отрезки, которые находятся правее, а среди оставшихся нужен полный перебор. Вот тут и нужны решения, которые позволят ограничить область перебора. Для этого сначала классифицируем точку, относительно небольшого числа областей с отрезками, а затем ведём поиск только среди тех отрезков, которые полностью или частично покрывают область. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 16:57 |
|
||
|
Простая задачка с отрезками
|
|||
|---|---|---|---|
|
#18+
Что-то я не въехал в сложность задачи, если для нее не подходит решение Павла Воронцова ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 23:28 |
|
||
|
Простая задачка с отрезками
|
|||
|---|---|---|---|
|
#18+
Я чего-то не понимаю или точка лажит на отрезке, если: 1. Она лежит на прямой из которой получился отрезок. 2. Она лежит в диапазоне координат которыми ограничен отрезок. Соответственно, если стоит необходимость частой проверки вхождения, то проще чуть расширить информацию об отрезке (благо, тема в форуме Проектирование, влючив в нее коэффициенты для уравнения прямой (y = kx +b), соответственно, если такие данные у нас есть, то проверка сводится к: 1. Проверки равенства kx+b игреку:). 2. Проверки диапазонов координат. т.е. Вставка усложнится решением линейной системы 2 уравнений:) Проверка будет апсолютно тривиальной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2005, 14:14 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33278278&tid=1545648]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
35ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 265ms |
| total: | 372ms |

| 0 / 0 |
