Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » алгоритмы поиска.

Ответить
Настройки темы
алгоритмы поиска.

Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


вот столкнулся с проблеммой поиска.

у меня есть набор точек ~(10000 - 1000000)
задается точка (А) и надо найти все точки расстояние между которыми и А > r.

точка задается тремя координатами с плавающей точкой.

как быстрее всего это вожно сделать.
учитывая то такой поиск надо производить примерно 10,000,000 раз?

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 02:10, 14-01-2004

 

Пользователь


Сообщения: 135
Благодарности: 0

Профиль | Отправить PM | Цитировать


Имхо надо их отсортировать по расстоянию от А.
А дальше просто.
Правда проблемы поиска плавно переходят в проблему сортировки. На крайняк qsort неплох.

Отправлено: 02:59, 14-01-2004 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Greyman

Человек


Сообщения: 3314
Благодарности: 104

Профиль | Отправить PM | Цитировать


bilytur
Какой смысл их сортировать? Этих же данных изначально нет (расстояний), так что перед сортировкой их все равно надо вычислять. При вычислении расстояния (корень суммы квадратов разностей координат) и сравнивается с R, и в случае удовлетворения условия точка помечается как удовлетворяющая требованиям (добавлением в выделенный массив либо установкой флага в массиве, описывающем точки). Сортировка бы имела смысл, если бы менялась не точка А, а ограничение расстояния - R.


Добавлено:

Vlad Drakula
А у тебя точки произвольно располагаются, или лежат на поверхности некоторой геометрической фигуры (например - шар). Во втором случае можно ускорить поиск проведением предварительного преобразования координат, иначе особых методов ускорения поиска ИМХО нет, тут уже чисто ворос кодирования.

-------
Будь проще...


Отправлено: 11:24, 14-01-2004 | #3


Модер


Сообщения: 1716
Благодарности: 17

Профиль | Сайт | Отправить PM | Цитировать


Vlad Drakula
Здесь можно произвести следующую оптимизацию.

Предположим, что тестируемая точка - (X,Y), точка А - это (A,B).

Условие большего расстояния (исключая случай r < 0) удобней записывать в виде (X-A)*(X-A) + (Y-B)*(Y-B) > r*r, то есть, без корней и степеней, так быстрее будет работать.

Сейчас неплохо бы выяснить, зачем такое количество измерений. Судя по всему, какие-то (либо все) параметры меняются. Если существуют неизменные параметры (например, все исходные точки и r постоянны, меняется только A и B), то надо заранее вычислить неизменную часть (в примере - каждой точке будет сопоставлено число r*r - X*X - Y*Y, как его потом использовать, надеюсь, ясно).

Даже если ни одной постоянной величины нет, отчаиваться тоже рано. В случае нашего пространства можно написать небольшую проверочку ДО проверки указанного неравенства, которая может позволить вообще не вычислять произведений: если |X-A| > r, то дальше можно уже не проверять, аналогично для другой координаты.

На что еще надо обратить внимание - так это на оптимальность кода. Например, проверку модуля я бы сделал на асме (если, конечно, у вас не суперкомпилятор, который сам все правильно сделает).


Добавлено:

Естественно, если есть возможность задать систему координат, адекватную задаче, надо это делать обязательно, тогда формула для проверки изменится, но основные принципы останутся теми же, то есть 1) не считать одно и то же, 2) грубо упростить проверку.

-------
Васкецов Сергей
http://registry.oszone.net


Отправлено: 19:48, 14-01-2004 | #4


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


vasketsov
во первых у меня три координаты
во вторых все написанное я уже применил
в третьих асм не применим, прога должна быть партируемой!

вот пришла идея, а что есть выбирать точки для скавнания только из промежутка между двумя сферами, то это достаточно быстро получится, так первая реальзация привела к снижкнию затрат от 2100с до 645с. причем самый тупой способ!

может у кого еще какие идеи есть?

Добавлено:

bilytur
qsort - не работает под VS2003, он работает но присылает указатель на пустое место!

Greyman
все точки действительно лежат на геометрических фигурах, но вот только на каждой фигуре их очень много.

может тогда кто скажет алгоритм сортировки, но не деревом?

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 19:56, 14-01-2004 | #5


Пользователь


Сообщения: 135
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Могу предложить следующее. Если памяти хватает создать 3 индекса на каждую координату. (Индексы упорядочены)
Бинарным поиском (очень быстрым) отсечь явно не нужные точки лежащие за описанным кубом. И принять все во вписанном кубе.
При наличии индексов это пройдет практически моментально. А вот дальше остается небольшой кубический слой.
И в нем уже вести поиск.

Отправлено: 00:31, 15-01-2004 | #6


Аватара для Greyman

Человек


Сообщения: 3314
Благодарности: 104

Профиль | Отправить PM | Цитировать


Vlad Drakula
Т.е. фигура не одна а несколько? Тогда смысла в смене системы координат ИМХО нет. Вот если бы все точки лежали на поверхности одной фигуры, тогда можно было бы вместо 3-х использовать только 2-е координаты.
* * Кстати, идея bilytur мне очень понравилась. При этом отсекать можно не только внешнее пространство куба (>r), но внутренний куб (<r*cos(пи/4)^2). Дальше распылятся наверно уже не имеет смысла, хотя в случае, если в оставшемся диапазоне все равно много точек, то можно провести проверку с использованием округленных целочисленных координат (насколько я понял они именно они могут использоваться как раз в качестве упомянутых индексов). Тогда потом останется уже проверить в настоящих дробных координах точки, лежащие в спорной ступенчатой сфере (толщина сферы при этом равна единице измерения координат).

-------
Будь проще...


Отправлено: 09:56, 15-01-2004 | #7


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


bilytur
экспериметр показал что с момощью сортировки одного индекса я снизил время до 36с ( напомню в начала было 2100с ), но это снишком медленно.

если знаешь алгоритм как производить выборку по дрем интексам то буду очень презначател если ты им поделишься.

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

Greyman
округление не допустимо, и так мне нехватает пары порядков точноси!

в данный момент я использую два индекса - расстояние до (0, 0, 0) и рассточние до (100, 100, 100).

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 18:33, 15-01-2004 | #8


Пользователь


Сообщения: 135
Благодарности: 0

Профиль | Отправить PM | Цитировать


Vlad Drakula
Готового алгоритма у меня нет. К тому-же может это и не быть столь эффективно.
Все зависит от конкретных параметров. Соотношения A, r, масштабы пространства.
Если много точек попадают в кубический слой то выигрыш явно будет не большим.

Отправлено: 02:23, 16-01-2004 | #9


Аватара для Greyman

Человек


Сообщения: 3314
Благодарности: 104

Профиль | Отправить PM | Цитировать


Vlad Drakula
Цитата:
округление не допустимо, и так мне нехватает пары порядков точноси!
Так я же и не говорил об округлении. Я говорил об скоростной выгоде при использовании целочисленной арифметики. Применив которую можно прошерстить большинство имеющихся точек, а оставшиеся уже проверять по дробным координатам. Перевод в целочисленную форму не значит просто округлить, если требуется большая точность после запятой, можно и увеличить все числа на несколько порядков (на тысячу предварительно умножаешь, например), тем самым ты просто уменьшаещь размерность единицы измерения, главное не забыть тогда и r на столько же порядков увеличить. ИМХО, если сделать второй массив для целочисленных координат и сделать предварительные преобразования для всех точек, то поиск заметно ускорится. Потом с дробной арифметикой останется проверять только точки, лежащие в упомянутой ступенчатой сфере. Если точек очень много, то выгода в скорости д/б сильно заметна.

-------
Будь проще...


Отправлено: 09:09, 16-01-2004 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » алгоритмы поиска.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Алгоритмы обхода матрицы mrcnn Программирование и базы данных 3 25-10-2006 22:07
Создания поиска по сайту(обсуждаем алгоритмы) Vlad Drakula Вебмастеру 14 09-09-2005 00:54
алгоритмы анализа трафика. Vlad Drakula Вебмастеру 1 14-07-2005 18:29
Алгоритмы сжатия видео Metal Prince Программирование и базы данных 2 03-02-2004 23:08
Алгоритмы решения СЛАУ YG Программирование и базы данных 1 10-11-2003 16:56




 
Переход