Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Простая задачка с отрезками / 12 сообщений из 12, страница 1 из 1
20.09.2005, 00:37
    #33277685
Lexx_K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
Задача: необходимо спроектировать базу данных отрезков на прямой, заданных координатами левого и правого концов (например: [200; 400]), так что бы можно было бы максимально эффективно построить поиск тех для заданной точки (например с координатой 110) найти все отрезки в которых она содержится. Ограничение на число таблиц нет.

Какие будут идеи?

Заранее спасибо.
...
Рейтинг: 0 / 0
20.09.2005, 07:02
    #33277765
Dimkas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
сказать по чести не понял затруднения :)

тривиальный подход:
делается таблица

(левай_граница,
правая_граница,
вхождение_левой_границы_в_отрезок,
вхождение_правой_границы_в_отрезок)

и ищется по соотвествующему условию (<,> ...)

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

с уважением,
Дмитрий Жучков
...
Рейтинг: 0 / 0
20.09.2005, 07:39
    #33277780
Павел Воронцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create table line(lborder int not null,
rborder int not null,
constraint line_pk primary key (lborder, rborder),
constraint line_chk check (lborder <= rborder)
);

select *
from line
where :point between lborder and rborder;
...
Рейтинг: 0 / 0
20.09.2005, 09:30
    #33277880
Серега
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
Lexx_K так что бы можно было бы максимально эффективно построить поиск тех для заданной точки (например с координатой 110) найти все отрезки в которых она содержится.
Наверное имеется в виду, что точка лежит на отрезке, а не совпадает с координатами концов. Тогда, ИМХО, ты можеш только отсечь те отрезки в которых она не может находиться по определению - типа лежит левее левой границы. А дальше только перебором по функции, где координаты отрезка и точки - входные параметры.
...
Рейтинг: 0 / 0
20.09.2005, 10:27
    #33278010
Dimkas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
Серега
Наверное имеется в виду, что точка лежит на отрезке, а не совпадает с координатами концов. Тогда, ИМХО, ты можеш только отсечь те отрезки в которых она не может находиться по определению - типа лежит левее левой границы. А дальше только перебором по функции, где координаты отрезка и точки - входные параметры.
левее левой... и правее правой :) т.е. :point between lborder and rborder;

это-то вроде понятно, другое дело, что если отрезков очень много, то простой перебор может не дать нормального результата по скорости и тогда придётся думать...
...
Рейтинг: 0 / 0
20.09.2005, 10:55
    #33278111
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
Поддерживать в соответствии с таблицей 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).
...
Рейтинг: 0 / 0
20.09.2005, 11:13
    #33278162
Валентин К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
Почитал каменты.
Простота спасет мир :)
Есть такое понятие как GIS, в котором все извраты с точками и линиями отработаны нормально. Правда не во всех серверах БД.
Какой у автора темы сервер БД?
...
Рейтинг: 0 / 0
20.09.2005, 11:42
    #33278278
Lexx_K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
БД - Oracle

Интересует как сделать с сублинейными затратами ( меньше O(n) ).

Отрезки или интервалы - не важно. Пусть для порядка концы отрезков будут пренадлежать отрезкам.
...
Рейтинг: 0 / 0
22.09.2005, 16:57
    #33284342
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
Lexx_KБД - Oracle

Интересует как сделать с сублинейными затратами ( меньше O(n) ).

Отрезки или интервалы - не важно. Пусть для порядка концы отрезков будут пренадлежать отрезкам.

В Oracle Spatial используется примерно тоже, что предложил LeXa NalBat.

Сначала всё пространстро разбиваем на небольшое количество одинаковых прямоугольных областей. Локализуем область и объекты, которые в ней находятся, ищем среди этих объектов.

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

Для этого сначала классифицируем точку, относительно небольшого числа областей с отрезками, а затем ведём поиск только среди тех отрезков, которые полностью или частично покрывают область.
...
Рейтинг: 0 / 0
26.09.2005, 23:28
    #33289670
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
Что-то я не въехал в сложность задачи, если для нее не подходит решение Павла Воронцова
...
Рейтинг: 0 / 0
27.09.2005, 14:14
    #33290873
Константин Хлопов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
Я чего-то не понимаю или точка лажит на отрезке, если:
1. Она лежит на прямой из которой получился отрезок.
2. Она лежит в диапазоне координат которыми ограничен отрезок.
Соответственно, если стоит необходимость частой проверки вхождения, то проще чуть расширить информацию об отрезке (благо, тема в форуме Проектирование, влючив в нее коэффициенты для уравнения прямой (y = kx +b), соответственно, если такие данные у нас есть, то проверка сводится к:
1. Проверки равенства kx+b игреку:).
2. Проверки диапазонов координат.
т.е.
Вставка усложнится решением линейной системы 2 уравнений:)
Проверка будет апсолютно тривиальной.
...
Рейтинг: 0 / 0
27.09.2005, 16:10
    #33291305
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая задачка с отрезками
Y лишнее:
авторЗадача: необходимо спроектировать базу данных отрезков на прямой
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Простая задачка с отрезками / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]