2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


В этом разделе нельзя создавать новые темы.



Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: расстояние межу точками
Сообщение13.12.2009, 00:06 
Заморожен
Аватара пользователя


18/12/07
8774
Новосибирск
PAV в сообщении #270792 писал(а):
Вообще-то далеко не факт, что быстрее. Вычисление модуля требует условного перехода (сменить знак, если отрицательно); на современных процессорах это будет работать медленнее, чем умножения без каких-либо условий.

Ну там ведь $x_a$ и $y_a$ фиксированы...

Надо тогда, наверное, вместо суммы модулей взять норму, где максимум из двух модулей, а потом не модуль считать, а четыре сравнения ($-\delta < x_a - x_y < \delta$ и то же самое с игреками).

 Профиль  
                  
 
 Re: расстояние межу точками
Сообщение13.12.2009, 00:11 
Заслуженный участник
Аватара пользователя


06/10/08
6422
PAV в сообщении #270792 писал(а):
Вообще-то далеко не факт, что быстрее. Вычисление модуля требует условного перехода (сменить знак, если отрицательно); на современных процессорах это будет работать медленнее, чем умножения без каких-либо условий.

Нет, для взятия можуля числа в регистре можно применить какую-то хитрую инструкцию и xor вроде.

 Профиль  
                  
 
 Re: расстояние межу точками
Сообщение13.12.2009, 00:11 
Заморожен
Аватара пользователя


18/12/07
8774
Новосибирск
Xaositect в сообщении #270796 писал(а):
2Профессор Снэйп
Да ну, умножение не настолько медленнее сложения. Данные читать все равно дольше будет.

Возможно. Я не раз писал, что от практики программирования довольно далёк. Высказал мысль в порядке предположения.

Просто представил себя на месте компьютера. Вот я сижу с листком бумаги, выполняя на нём действия "столбиком", а мне подают координаты точек, одну за другой. Я храню текущее значение минимума. И когда мне дают очередную точку, я прежде чем что-то возводить в квадрат, для начала прикину по каждой из координат, а не верно ли, что очередная точка заведомо дальше, чем уже найденная минимальная. Просто для человека, в отличие от компьютера, умножение --- гораздо более трудоёмкая операция, чем сложение/вычитание.

-- Вс дек 13, 2009 03:20:48 --

Xaositect в сообщении #270800 писал(а):
Нет, для взятия модуля числа в регистре можно применить какую-то хитрую инструкцию и $\mathrm{xor}$ вроде.

Меня тоже заинтересовал этот вопрос, который хочется задать присутствующим здесь программистам. Если число целое и хранится в двоично-дополнительном коде, то сравнение с нулём и вычиление модуля происходят моментально. А если с плавающей точкой... просто не знаю.

 Профиль  
                  
 
 Re: расстояние межу точками
Сообщение13.12.2009, 00:26 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Профессор Снэйп в сообщении #270801 писал(а):
Меня тоже заинтересовал этот вопрос, который хочется задать присутствующим здесь программистам. Если число целое и хранится в двоично-дополнительном коде, то сравнение с нулём и вычиление модуля происходят моментально. А если с плавающей точкой... просто не знаю.

Вот, я нашел для целых чисел ассемблер:
Используется синтаксис ASM
cdq
add eax, edx
xor eax, edx


Для floating point есть специальные инструкции сопроцессора, в том числе FABS для вычисления модуля.


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

 Профиль  
                  
 
 Re: расстояние межу точками
Сообщение13.12.2009, 00:48 
Заслуженный участник


11/05/08
32166
Для плавающей точки модуль берётся гораздо быстрее, чем для целого -- надо просто убить знаковый бит. Т.е. просто наложить маску на соотв. байт по AND.

Профессор Снэйп в сообщении #270789 писал(а):
Теперь если евклидово расстояние от $(x_a,y_a)$ до различных точек массива различается больше, чем в $2$ раза, то можно смело использовать норму $\| \cdot \|_1$ и будет найдена нужная точка. А если разброс расстояний просто велик, то можно сначала из огромного массива точек выделить малую часть таких точек, что расстояние от выбранной до каждой из них в норме $\| \cdot \|_1$ не более чем в $2$ раза больше чем расстояние от выбранной до минимальной в той же норме, а потом этой части уже смотреть минимум по евклидовой норме.

Можно; а накладные расходы?...

"Выделить малую часть" -- значат поставить на этих точках флажки. Ну или переписывать"подозрительные" точки в отдельный массив. В любом случае понадобится дополнительная память. Причём при добавлении каждой новой подозрительной точки придётся пересматривать все ранее добавленные, чтобы пересмотреть их статус.

В общем, Ваш метод имеет только одно преимущество -- он сложнее. Но зато гораздо медленнее.

 Профиль  
                  
 
 Re: расстояние межу точками
Сообщение13.12.2009, 06:52 
Заслуженный участник


04/05/09
4587
Быстрее, чем за O(n) всё равно не получится - надо все точки хотя бы по разу пройти.
Решение в лоб уже O(n). Осталось только уменьшить константу. Во первых, не брать корень - очень медленная операция. Во вторых loop unrolling. В третьих SSE.
Но это уже не математика, а программирование.

-- Сб дек 12, 2009 22:56:21 --

Sasha2 в сообщении #270704 писал(а):
Наверное единственное, что Вам тут поможет (если это можно так назвать), так это только использование равносильности двух неравенств

$(x_1-a)^2+(y_1-b)^2\geq{(x_2-a)^2+(y_2-b)^2}$
и
$(x_1-x_2)(x_1+x_2-2a)+(y_1-y_2)(y_1+y_2-2b)\geq{0}$

Умножений меньше. Хотя, стоит ли оно того, ведь не миллион же точек у Вас.
Умножений столько же. В первом случае одна из величин уже посчитана - текущий минимум. Так что в обоих случаях придётся умножать по два раза, но во втором случае гораздо больше сложений.

 Профиль  
                  
 
 Re: расстояние межу точками
Сообщение13.12.2009, 08:39 
Заморожен
Аватара пользователя


18/12/07
8774
Новосибирск
ewert в сообщении #270817 писал(а):
"Выделить малую часть" -- значат поставить на этих точках флажки. Ну или переписывать"подозрительные" точки в отдельный массив. В любом случае понадобится дополнительная память. Причём при добавлении каждой новой подозрительной точки придётся пересматривать все ранее добавленные, чтобы пересмотреть их статус.

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

 Профиль  
                  
 
 Re: расстояние межу точками
Сообщение13.12.2009, 11:05 
Заслуженный участник


11/05/08
32166
Профессор Снэйп в сообщении #270856 писал(а):
Вовсе не обязательно. Всё можно делать за один проход. Считаем текущий минимум в обоих нормах, и каждый раз, когда минимум в первой норме оказался более чем в 2 раза больше текущего, вторую норму просто не считаем.

Да, насчёт гораздо медленнее я погорячился. Но -- всё равно медленнее. Вы на каждом шаге заменяете одно умножение на одно взятие модуля, выгода от чего сомнительна. Но при этом добавляете от одной до трёх весьма не безобидных операции: одну операцию сравнения плюс иногда ещё одно сравнение и одно умножение на два. А если не повезёт с отбраковкой ни в ту, ни в другую сторону, то объём вычислений (на этом шаге) и вовсе удваивоится.

Причём "иногда" -- это если точки разбросаны более-менее равномерно. А если в кольце с не слишком различающимися радиусами -- то довольно часто. В пределе: если почти на окружности -- так и вовсе почти постоянно.

 Профиль  
                  
 
 Re: расстояние межу точками
Сообщение13.12.2009, 15:01 


21/06/06
1721
А вообще я так понял, что если каждую точку $(x_i, y_i)$ обратить в точку $(x_i, y_i, i)$ то все равно нет такой формулы, при помощи которой можно выделить тот самый индекс $i$, который дает минимум (или максимум).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group