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

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

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

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

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

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

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

с уважением,
Дмитрий Жучков
...
Рейтинг: 0 / 0
Простая задачка с отрезками
    #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
Простая задачка с отрезками
    #33277880
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexx_K так что бы можно было бы максимально эффективно построить поиск тех для заданной точки (например с координатой 110) найти все отрезки в которых она содержится.
Наверное имеется в виду, что точка лежит на отрезке, а не совпадает с координатами концов. Тогда, ИМХО, ты можеш только отсечь те отрезки в которых она не может находиться по определению - типа лежит левее левой границы. А дальше только перебором по функции, где координаты отрезка и точки - входные параметры.
...
Рейтинг: 0 / 0
Простая задачка с отрезками
    #33278010
Dimkas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Серега
Наверное имеется в виду, что точка лежит на отрезке, а не совпадает с координатами концов. Тогда, ИМХО, ты можеш только отсечь те отрезки в которых она не может находиться по определению - типа лежит левее левой границы. А дальше только перебором по функции, где координаты отрезка и точки - входные параметры.
левее левой... и правее правой :) т.е. :point between lborder and rborder;

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

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

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

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

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

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

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

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

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


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