|
|
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Есть отрезки с координатами x1 и x2 (отмечаю что все отрезки на прямой). Отрезков много примерно 200 000 000. Как наиболее оптимально их разместить в БД (к примеру оракл). Можно строить любые индексы, дополнительные таблицы или все что нужно. Как получить наиболее разумным способом все отрезки котрые проходят через точку x0. Иногда отрезков нет, иногда 2-7, иногда 10 000 (но редко). Есть еще одно условие - при увеличении кол-ва отрезков производительность должна падать менее чем линейно пропорционально кол-ву добавляемых отрезков. Мое решение с таблицей IOT был назван не продуманным, значит есть какое то другое решение. У кого какие будут варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 18:37 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
А где примеры данных? Я так понимаю, что это задача из разряда "отобрать из списка интервалов времени все, включающие заданное время"? Так с чем надо определиться? с СУБД? с быстродействием запроса? В любом случае, если не писАть свою систему хранения данных, то это вопрос в разделы "Использование СУБД", а если писАть, то в "Проектирование БД". И с Вами там поделятся... -------------- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 23:17 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
нубпрог опишите точно все возможные значения x1, x2, x0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 23:27 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
видимо данные это X1 - первая координата отрезка и X2 - вторая координата отрезка. а задача сводится к тому чтобы выбирать из базы те отрезки которые удовлетворяют требованиям, как пример, отрезки проходящие через начало координат. при этом очень важна производительность таких выборок, чтобы вычисления происходящие входе выборки не сильно влияли на работу такой операции. правильно я понял суть задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 23:47 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
2 hunterman совершенно верно. 2 miksoft к примеру Код: plaintext 1. 2. 3. 4. 5. найти только те отрезки что проходят через точку х0 для случая х0 = 15, 20, 50, 61 и так далее (в один момент времени х0 равно только одному значению) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2008, 01:38 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
нубпрогМое решение с таблицей IOT был назван не продуманным, значит есть какое то другое решение. У кого какие будут варианты? Лично я в первую очередь попробовал бы воспользоваться опцией, включенной в Oracle специально для решения этой задачи, и другие варианты искал бы только при получении весомых доводов "против". Поскольку задачка выглядит тестовой, поиск названия опции сделаем домашним заданием. Ключевые слова - одномерный R-индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2008, 01:58 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Не знаю оракла, может там и есть такая опция.. Но вот такой вариант ещё в голову пришёл: Каждый конец отрезка принадлежит одному или нескольким отрезкам (если они перекрываются). Составляем таблицу содержащую x1 union x2 со связью один ко многим к таблице отрезков(по точке можно найти все отрезки которым она принадлежит). Поиск: Для x0 ищем две ближайшие точки a < x0 < b, для "a" и для "b" получаем все отрезки которые необходимо проверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2008, 16:52 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Нехилая задача, в смысле, 200 000 000 записей. Предлагаю такой подход: 1) Нумеруем все отрезки; 2) Каждому отрезку сопоставляем множество (обозначим его через A(i), где i -- номер этого отрезка) номеров отрезков, с которым этот отрезок пересекается. То есть, в цикле очередной отрезок проверяем на пересечение с оставшимися. Если окажется, что текущий отрезок (пусть это i-й) пересекается с проверяемым (j-й), то во множество A(i) добавляем номер i, а в A(j) -- j. Причём, при проверке отрезка смотрим его вспомогательное множество: по имеющимся там номерам проверять уже не нужно; 3) При проверке того, каким отрезкам принадлежит точка x0,последовательно проверяем отрезки на предмет содержания этой точки x0: как только поймаем первый такой отрезок, раскручиваем его вспомогательное множество. Вот и всё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 06:34 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Опечатка: пункт второй следует читать в следующей редакции: 2) Каждому отрезку сопоставляем множество (обозначим его через A(i), где i -- номер этого отрезка) номеров отрезков, с которым этот отрезок пересекается. То есть, в цикле очередной отрезок проверяем на пересечение с оставшимися. Если окажется, что текущий отрезок (пусть это i-й) пересекается с проверяемым (j-й), то во множество A(i) добавляем номер j, а в A(j) -- i. Причём, при проверке отрезка смотрим его вспомогательное множество: по имеющимся там номерам проверять уже не нужно; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 06:36 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
TeXpertКаждому отрезку сопоставляем множество (обозначим его через A(i), где i -- номер этого отрезка) номеров отрезков, с которым этот отрезок пересекается. И как хранить такое множество? Вы помните, что отрезков не три с половиной штуки, а 200'000'000? Одно из эффективных решений задачи предложено в книге "Алгоритмы: построение и анализ" (Кормен Т., Лейзерсон Ч., Ривест Р.) (стр 375, Дерево отрезков) Важный момент не был озвучен: как часто меняются данные? Ведь, для статичных и для часто меняющихся данных могут быть совершенно разные решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 14:56 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Vladimir Sitnikov И как хранить такое множество? Вы помните, что отрезков не три с половиной штуки, а 200'000'000? Читай внимательно -- я об этом знаю TeXpertНехилая задача, в смысле, 200 000 000 записей И ещё раз внимательно смотри первый пост нубпрогМожно строить любые индексы, дополнительные таблицы или все что нужно То есть, для автора это не проблема. Так что, будь внимателен, прежде чем смеяться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 15:06 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
TeXpert Vladimir Sitnikov И как хранить такое множество? Вы помните, что отрезков не три с половиной штуки, а 200'000'000? Читай внимательно -- я об этом знаю прочитал внимательно. Оказалось, сам алгоритм тоже смысл не особый имеет. У меня всего лишь пара "простых" вопросов: 1) TeXpertТо есть, в цикле очередной отрезок проверяем на пересечение с оставшимися Можно подробнее озвучить алгоритм проверки на пересечение двух отрезков? Это что-нибудь похожее на Код: plaintext 1. 2. 3. Вынужден вас огорчить, но тот этот вариант невозможно реализовать за приемлемое время (даже, если 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Тб данных, если их вдруг потребует чей-то алгоритм. Давайте учитывать, что бесконечных объёмов памяти и бесконечнобыстрых процессоров не бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 17:00 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Vladimir SitnikovМожно подробнее озвучить алгоритм проверки на пересечение двух отрезков? Это что-нибудь похожее на for i in 1..N for j in i+1..N if intersects(otrezok(i), otrezok(j))... или всё-таки более умное? Вынужден вас огорчить, но тот этот вариант невозможно реализовать за приемлемое время (даже, если intersects будет выполняться за 1 такт процессора, то на выполнение таких двух циклов потребуется больше года) Афигеть... Для проверки пересечения двух отрезков надо что-то умное изображать? А про "больше года" -- это надо, наверное, постараться... Вкратце: есть координаты концов отрезков на прямой, тут даже придумывать нечего ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 17:07 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
В приципе, насчёт времени он нас не ограничивает (ведь любая реализация решения потребует кучу времени -- а вдруг у него ресурсов немеряно?), потом, цикл всё-таки не линейно, так скажем, хотя, предельные случаи не исключаются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 17:10 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
А потом, я всё-таки прикинул основную идею, а вот при реализации, естественно, надо учесть различные предельные случаи (например, все отрезки вложены, или часть отрезков распадаются на непересекающиеся подмножества). Естественно, потребуется более глубокий анализ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 17:15 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Vladimir SitnikovЕсли я правильно понял ваш алгоритм... Именно, неправильно ты понял. Вот это ...то он предложит проверять "дополнительное множество", в которое попадает ещё миллион отрезков. Т.е. миллион действий зря Естественно, при реализации я бы такие вещи исключил -- ведь я писал TeXpert...раскручиваем его вспомогательное множество А ведь это не примитивный цикл. В своё время мне приходилось заниматься визуализацией трёхмерных объектов на весьма слабеньких машинах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 17:33 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
А насчёт Vladimir SitnikovДавайте учитывать, что бесконечных объёмов памяти и бесконечнобыстрых процессоров не бывает так у автора сама постановка такая -- он нас не ограничивает:)). Ведь ясно, что там такая причудливая конфигурация отрезков может оказаться, что придётся считать годами (если дисковой памяти не хватит, а это может запросто случиться). Так что, придётся решать задачу в теоретической плоскости ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 17:40 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
TeXpertАфигеть... Для проверки пересечения двух отрезков надо что-то умное изображать? А про "больше года" -- это надо, наверное, постараться... Вкратце: есть координаты концов отрезков на прямой, тут даже придумывать нечегоНаучитесь думать, прежде чем что-либо говорить. Для того, чтобы проверить каждый отрезок на предмет его пересечения со всеми остальными потребуется 200'000'000 * 200'000'000 = 40'000'000'000'000'000 операций. Современные процессоры работают на частоте порядка 1Ггц == 1'000'000'000 операций в секунду. Надеюсь, вы в состоянии правильно поделить одно на другое и перевести из секунд в сутки/года? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 17:40 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Ну, насчёт думать не беспокойся -- тут проблем нет, читай уточнения. Насчёт времени -- это и так ясно, я с самого начала на это не стал заморачиваться -- подчеркну ещё раз, он нас не ограничивает (ибо задача у него и так малопрактична). Я просто удивился, какие сложности могут быть со сравнением отрезков, вот ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 17:44 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
TeXpertА насчёт Vladimir SitnikovДавайте учитывать, что бесконечных объёмов памяти и бесконечнобыстрых процессоров не бывает так у автора сама постановка такая -- он нас не ограничивает:)). Ведь ясно, что там такая причудливая конфигурация отрезков может оказаться, что придётся считать годами (если дисковой памяти не хватит, а это может запросто случиться). Так что, придётся решать задачу в теоретической плоскости Когда освоите алгоритм из "Алгоритмы: построение и анализ", можно будет и пофантазировать, но, если я не ошибаюсь, то тому алгоритму нужно было ~4N памяти (порядка 5-10Гб для 200'000'000 отрезков). И время работы алгоритма (ответ на вопрос "а существует ли отрезок, проходящий через точку x0?") не O(N), а O(Log(N)) вне зависимости от конфигурации отрезков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 17:46 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Так в том-то и дело, постороив вспомогательные множества, мы бы сэкономили при повторных (для других значений точек x0) вычислениях (поисках). Этот момент я забыл подчеркнуть. Ведь у нас, проще говоря, уже была бы информация о том, какие подмножества можно будет сразу исключить из рассмотрения. А предлагаемом тобой алгоритме, опять же будем перебирать, но уже для другой точки. Хотя, для такого количества отрезков это непрактично, думаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 17:53 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Уточню: Хотя, для такого количества отрезков это непрактично, думаю относится к моему предложению. Хотя, автор обещает неограниченное табличное пространство, и, возможно, у него суперкомпьютеры:)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 18:06 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Создать таблицу содержащую 3 поля ID,X1,X2 а потом подчиненную таблицу где держать ID пересекающихся отрезков. есть подозрение что можно решить задачу зациклив основную таблицу но имхо не уверен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 20:20 |
|
||
|
задачка о отрезках
|
|||
|---|---|---|---|
|
#18+
Василий ВикторовичСоздать таблицу содержащую 3 поля ID,X1,X2 а потом подчиненную таблицу где держать ID пересекающихся отрезков. есть подозрение что можно решить задачу зациклив основную таблицу но имхо не уверен Причем создавать не всю базу сразу а по мере требования ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2008, 20:23 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35493259&tid=1345083]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
167ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 454ms |

| 0 / 0 |
