powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / задачка о отрезках
24 сообщений из 24, страница 1 из 1
задачка о отрезках
    #35466348
нубпрог
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть отрезки с координатами x1 и x2 (отмечаю что все отрезки на прямой).
Отрезков много примерно 200 000 000. Как наиболее оптимально их разместить в БД (к примеру оракл). Можно строить любые индексы, дополнительные таблицы или все что нужно.

Как получить наиболее разумным способом все отрезки котрые проходят через точку x0. Иногда отрезков нет, иногда 2-7, иногда 10 000 (но редко). Есть еще одно условие - при увеличении кол-ва отрезков производительность должна падать менее чем линейно пропорционально кол-ву добавляемых отрезков.

Мое решение с таблицей IOT был назван не продуманным, значит есть какое то другое решение.
У кого какие будут варианты?
...
Рейтинг: 0 / 0
задачка о отрезках
    #35466535
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где примеры данных?
Я так понимаю, что это задача из разряда
"отобрать из списка интервалов времени все, включающие заданное время"?
Так с чем надо определиться? с СУБД? с быстродействием запроса?

В любом случае, если не писАть свою систему хранения данных, то это вопрос
в разделы "Использование СУБД", а если писАть, то в "Проектирование БД".
И с Вами там поделятся...
--------------
...
Рейтинг: 0 / 0
задачка о отрезках
    #35466543
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нубпрог
опишите точно все возможные значения x1, x2, x0.
...
Рейтинг: 0 / 0
задачка о отрезках
    #35466550
hunterman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
видимо данные это X1 - первая координата отрезка и X2 - вторая координата отрезка.

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

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

правильно я понял суть задачи?
...
Рейтинг: 0 / 0
задачка о отрезках
    #35466610
нубпрог
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 hunterman
совершенно верно.

2 miksoft

к примеру

Код: plaintext
1.
2.
3.
4.
5.
х1     х2
 1       20 
 12     14 
 15      60 
 63     64 
 70     100 
и так далее


найти только те отрезки что проходят через точку х0 для случая х0 = 15, 20, 50, 61 и так далее (в один момент времени х0 равно только одному значению)
...
Рейтинг: 0 / 0
задачка о отрезках
    #35466616
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нубпрогМое решение с таблицей IOT был назван не продуманным, значит есть какое то другое решение. У кого какие будут варианты?
Лично я в первую очередь попробовал бы воспользоваться опцией, включенной в Oracle специально для решения этой задачи, и другие варианты искал бы только при получении весомых доводов "против". Поскольку задачка выглядит тестовой, поиск названия опции сделаем домашним заданием.

Ключевые слова - одномерный R-индекс.
...
Рейтинг: 0 / 0
задачка о отрезках
    #35466881
Паля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю оракла, может там и есть такая опция..

Но вот такой вариант ещё в голову пришёл:
Каждый конец отрезка принадлежит одному или нескольким отрезкам (если они перекрываются).
Составляем таблицу содержащую x1 union x2 со связью один ко многим к таблице отрезков(по точке можно найти все отрезки которым она принадлежит).

Поиск:
Для x0 ищем две ближайшие точки a < x0 < b, для "a" и для "b" получаем все отрезки которые необходимо проверить.
...
Рейтинг: 0 / 0
задачка о отрезках
    #35491781
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нехилая задача, в смысле, 200 000 000 записей.
Предлагаю такой подход:
1) Нумеруем все отрезки;
2) Каждому отрезку сопоставляем множество (обозначим его через A(i), где i -- номер этого отрезка) номеров отрезков, с которым этот отрезок пересекается. То есть, в цикле очередной отрезок проверяем на пересечение с оставшимися. Если окажется, что текущий отрезок (пусть это i-й) пересекается с проверяемым (j-й), то во множество A(i) добавляем номер i, а в A(j) -- j. Причём, при проверке отрезка смотрим его вспомогательное множество: по имеющимся там номерам проверять уже не нужно;
3) При проверке того, каким отрезкам принадлежит точка x0,последовательно проверяем отрезки на предмет содержания этой точки x0: как только поймаем первый такой отрезок, раскручиваем его вспомогательное множество. Вот и всё
...
Рейтинг: 0 / 0
задачка о отрезках
    #35491782
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опечатка: пункт второй следует читать в следующей редакции:

2) Каждому отрезку сопоставляем множество (обозначим его через A(i), где i -- номер этого отрезка) номеров отрезков, с которым этот отрезок пересекается. То есть, в цикле очередной отрезок проверяем на пересечение с оставшимися. Если окажется, что текущий отрезок (пусть это i-й) пересекается с проверяемым (j-й), то во множество A(i) добавляем номер j, а в A(j) -- i. Причём, при проверке отрезка смотрим его вспомогательное множество: по имеющимся там номерам проверять уже не нужно;
...
Рейтинг: 0 / 0
задачка о отрезках
    #35492768
Vladimir Sitnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TeXpertКаждому отрезку сопоставляем множество (обозначим его через A(i), где i -- номер этого отрезка) номеров отрезков, с которым этот отрезок пересекается. И как хранить такое множество? Вы помните, что отрезков не три с половиной штуки, а 200'000'000?


Одно из эффективных решений задачи предложено в книге "Алгоритмы: построение и анализ" (Кормен Т., Лейзерсон Ч., Ривест Р.) (стр 375, Дерево отрезков)

Важный момент не был озвучен: как часто меняются данные? Ведь, для статичных и для часто меняющихся данных могут быть совершенно разные решения.
...
Рейтинг: 0 / 0
задачка о отрезках
    #35492798
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Sitnikov И как хранить такое множество? Вы помните, что отрезков не три с половиной штуки, а 200'000'000? Читай внимательно -- я об этом знаю TeXpertНехилая задача, в смысле, 200 000 000 записей И ещё раз внимательно смотри первый пост нубпрогМожно строить любые индексы, дополнительные таблицы или все что нужно То есть, для автора это не проблема. Так что, будь внимателен, прежде чем смеяться
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493127
Vladimir Sitnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TeXpert Vladimir Sitnikov И как хранить такое множество? Вы помните, что отрезков не три с половиной штуки, а 200'000'000? Читай внимательно -- я об этом знаю
прочитал внимательно. Оказалось, сам алгоритм тоже смысл не особый имеет.

У меня всего лишь пара "простых" вопросов:
1) TeXpertТо есть, в цикле очередной отрезок проверяем на пересечение с оставшимися
Можно подробнее озвучить алгоритм проверки на пересечение двух отрезков?
Это что-нибудь похожее на
Код: plaintext
1.
2.
3.
 for  i  in   1 ..N
   for  j  in  i+ 1 ..N
     if  intersects(otrezok(i), otrezok(j))...
или всё-таки более умное?

Вынужден вас огорчить, но тот этот вариант невозможно реализовать за приемлемое время (даже, если intersects будет выполняться за 1 такт процессора, то на выполнение таких двух циклов потребуется больше года).

2) Даже, если вы поведаете как реализовать 1-ый пункт (а это очень интересно послушать! без шуток! ведь, это и есть почти та задача, которую просит решить автор). Информация о том, что "отрезок i пересекается с отрезком j" всё равно не даёт мало информации для ответа на поставленую задачу.
Более того,

Контрпример для вашего алгоритма:
один отрезок с координатами (-10, 10)
миллион отрезков с координатами (0,10) (если хотите, у каждого отрезка координаты могут отличаться, но все они положительные, и пересекаются с 1-ым)

проверяемая точка x0 = -5.
Правильный ответ -- один отрезок (-10, 10)
Если я правильно понял ваш алгоритм, то он предложит проверять "дополнительное множество", в которое попадает ещё миллион отрезков. Т.е. миллион действий зря.

3) TeXpert При проверке того, каким отрезкам принадлежит точка x0,последовательно проверяем отрезки на предмет содержания этой точки x0: как только поймаем первый такой отрезок, раскручиваем его вспомогательное множествоА, если мы "поймаем" его лишь в самый последний момент или вообще не поймаем?
Т.е. ваш алгоритм гарантированно потребует перепроверку всех 200'000'000 отрезков, если ни один из них не проходит через точку x0.
Зачем тогда это вспомогательное множество вообще нужно?

3) TeXpert нубпрогМожно строить любые индексы, дополнительные таблицы или все что нужно То есть, для автора это не проблема. Так что, будь внимателен, прежде чем смеятьсяСомневаюсь, что для автора не будет проблемой перерабатывать 100Тб данных, если их вдруг потребует чей-то алгоритм. Давайте учитывать, что бесконечных объёмов памяти и бесконечнобыстрых процессоров не бывает.
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493149
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir SitnikovМожно подробнее озвучить алгоритм проверки на пересечение двух отрезков?
Это что-нибудь похожее на

for i in 1..N
for j in i+1..N
if intersects(otrezok(i), otrezok(j))...

или всё-таки более умное?

Вынужден вас огорчить, но тот этот вариант невозможно реализовать за приемлемое время (даже, если intersects будет выполняться за 1 такт процессора, то на выполнение таких двух циклов потребуется больше года) Афигеть... Для проверки пересечения двух отрезков надо что-то умное изображать? А про "больше года" -- это надо, наверное, постараться... Вкратце: есть координаты концов отрезков на прямой, тут даже придумывать нечего
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493159
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В приципе, насчёт времени он нас не ограничивает (ведь любая реализация решения потребует кучу времени -- а вдруг у него ресурсов немеряно?), потом, цикл всё-таки не линейно, так скажем, хотя, предельные случаи не исключаются
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493176
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А потом, я всё-таки прикинул основную идею, а вот при реализации, естественно, надо учесть различные предельные случаи (например, все отрезки вложены, или часть отрезков распадаются на непересекающиеся подмножества). Естественно, потребуется более глубокий анализ
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493234
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir SitnikovЕсли я правильно понял ваш алгоритм... Именно, неправильно ты понял. Вот это ...то он предложит проверять "дополнительное множество", в которое попадает ещё миллион отрезков. Т.е. миллион действий зря Естественно, при реализации я бы такие вещи исключил -- ведь я писал TeXpert...раскручиваем его вспомогательное множество А ведь это не примитивный цикл. В своё время мне приходилось заниматься визуализацией трёхмерных объектов на весьма слабеньких машинах
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493258
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А насчёт Vladimir SitnikovДавайте учитывать, что бесконечных объёмов памяти и бесконечнобыстрых процессоров не бывает так у автора сама постановка такая -- он нас не ограничивает:)). Ведь ясно, что там такая причудливая конфигурация отрезков может оказаться, что придётся считать годами (если дисковой памяти не хватит, а это может запросто случиться). Так что, придётся решать задачу в теоретической плоскости
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493259
Vladimir Sitnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TeXpertАфигеть... Для проверки пересечения двух отрезков надо что-то умное изображать? А про "больше года" -- это надо, наверное, постараться... Вкратце: есть координаты концов отрезков на прямой, тут даже придумывать нечегоНаучитесь думать, прежде чем что-либо говорить. Для того, чтобы проверить каждый отрезок на предмет его пересечения со всеми остальными потребуется 200'000'000 * 200'000'000 = 40'000'000'000'000'000 операций.
Современные процессоры работают на частоте порядка 1Ггц == 1'000'000'000 операций в секунду.

Надеюсь, вы в состоянии правильно поделить одно на другое и перевести из секунд в сутки/года?
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493278
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, насчёт думать не беспокойся -- тут проблем нет, читай уточнения. Насчёт времени -- это и так ясно, я с самого начала на это не стал заморачиваться -- подчеркну ещё раз, он нас не ограничивает (ибо задача у него и так малопрактична). Я просто удивился, какие сложности могут быть со сравнением отрезков, вот
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493285
Vladimir Sitnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TeXpertА насчёт Vladimir SitnikovДавайте учитывать, что бесконечных объёмов памяти и бесконечнобыстрых процессоров не бывает так у автора сама постановка такая -- он нас не ограничивает:)). Ведь ясно, что там такая причудливая конфигурация отрезков может оказаться, что придётся считать годами (если дисковой памяти не хватит, а это может запросто случиться). Так что, придётся решать задачу в теоретической плоскости
Когда освоите алгоритм из "Алгоритмы: построение и анализ", можно будет и пофантазировать, но, если я не ошибаюсь, то тому алгоритму нужно было ~4N памяти (порядка 5-10Гб для 200'000'000 отрезков).

И время работы алгоритма (ответ на вопрос "а существует ли отрезок, проходящий через точку x0?") не O(N), а O(Log(N)) вне зависимости от конфигурации отрезков.
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493314
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так в том-то и дело, постороив вспомогательные множества, мы бы сэкономили при повторных (для других значений точек x0) вычислениях (поисках). Этот момент я забыл подчеркнуть. Ведь у нас, проще говоря, уже была бы информация о том, какие подмножества можно будет сразу исключить из рассмотрения. А предлагаемом тобой алгоритме, опять же будем перебирать, но уже для другой точки. Хотя, для такого количества отрезков это непрактично, думаю
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493344
TeXpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточню: Хотя, для такого количества отрезков это непрактично, думаю относится к моему предложению. Хотя, автор обещает неограниченное табличное пространство, и, возможно, у него суперкомпьютеры:))
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493568
Фотография Василий Викторович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создать таблицу содержащую 3 поля ID,X1,X2 а потом подчиненную таблицу где держать ID пересекающихся отрезков. есть подозрение что можно решить задачу зациклив основную таблицу но имхо не уверен
...
Рейтинг: 0 / 0
задачка о отрезках
    #35493574
Фотография Василий Викторович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий ВикторовичСоздать таблицу содержащую 3 поля ID,X1,X2 а потом подчиненную таблицу где держать ID пересекающихся отрезков. есть подозрение что можно решить задачу зациклив основную таблицу но имхо не уверен
Причем создавать не всю базу сразу а по мере требования
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / задачка о отрезках
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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