Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 28.03.2012
Сообщений: 55

Как можно сократить время вычисления?!

20.02.2013, 18:11. Показов 1656. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На ограниченной, но достаточно большой по площади, плоскости есть одна
опорная точка с координатами x0 и y0, а также некоторое число N других точек c
известными координатами xi
и yi. Требуется найти среди N точек ближайшую к опорной.
Известно, что расстояние между двумя точками в декартовых координатах
вычисляется как d=sqrt((x2-x1)^2+(y2-y1)^2).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.02.2013, 18:11
Ответы с готовыми решениями:

Рекурсивная функция - сократить время, затраченное на вычисления
Условия задачи: Пусть x1=x2=x3=1; xi=xi-1+xi-3, i=4,5... Код функции: int xn(int n) { if (n == 0) return 0; if...

Как сократить время выполнения
def test(word1, word2): return sorted(word1) == sorted(word2) n = int(input()) words = for i in range(n): word =...

Как сократить время работы процедуры
Здравствуйте. Собственно, сабж. MSQL. Есть исходная таблица с полями hash, id, value, date. Хочу заполнить две другие таблицы - ...

19
Модератор
10430 / 5718 / 3404
Регистрация: 17.08.2012
Сообщений: 17,387
20.02.2013, 18:30
g=(x2-x1)2+(y2-y1)2. Найти минимум, а потом, если нужно, d=√g.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,889
Записей в блоге: 2
20.02.2013, 19:19
"от простого к сложному"

1) Для нахождения ближайших sqrt не нужно, достаточна сумма квадратов

2) Сортируем точки по X, если X равны то по Y (второй ключ). Затем двоичным поиском находим ближайшую по X и смотрим соседние точки спереди и сзади до тех пор пока Х-расстояние не превысит минимальное найденное

3) kd-tree
0
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
24.02.2013, 12:27
Цитата Сообщение от Igor3D Посмотреть сообщение
2) Сортируем точки по X, если X равны то по Y (второй ключ). Затем двоичным поиском находим ближайшую по X и смотрим соседние точки спереди и сзади до тех пор пока Х-расстояние не превысит минимальное найденное
3) kd-tree
Зачем предлагать https://www.cyberforum.ru/cgi-bin/latex.cgi?O(n\cdot logn) когда вы уже предложили https://www.cyberforum.ru/cgi-bin/latex.cgi?O(n)?
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,889
Записей в блоге: 2
24.02.2013, 15:18
Цитата Сообщение от iama Посмотреть сообщение
Зачем предлагать https://www.cyberforum.ru/cgi-bin/latex.cgi?O(n\cdot logn) когда вы уже предложили https://www.cyberforum.ru/cgi-bin/latex.cgi?O(n)?
Не вижу где здесь O(N) ни O(N log(N)). Kd-tree сильнее, но есть случаи когда и оно (увы) сводится к полному перебору
0
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
24.02.2013, 15:55
Igor3D, полный перебор вершин — это линия.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,889
Записей в блоге: 2
24.02.2013, 16:09
Цитата Сообщение от iama Посмотреть сообщение
Igor3D, полный перебор вершин — это линия.
Не понимаю о чем Вы ??? Если точки лежат на одной линии - они прекрасно находятся той же сортировкой, это наоборот, самый легкий случай. А вот когда сортировка тормозная

............*******
............*******
............*******



......A(*)..............B(*) ..................> X

"B" - ближайшая к "A" но в сортированном массиве туча точек между ними (вверху). Где тут логарифм, тем более O(N) ?
0
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
25.02.2013, 11:23
Igor3D, вы или очень забавно шутите, или у меня для вас плохие новости. Схема выполнения:
C++
1
2
3
4
5
int min_dist = INT_MAX, closest = -1;
 
for (int i = 0; i < n; i++)
    if (dist(x[i], y[i], xm, ym) < min_dist)
        closest = i, min_dist = dist(x[i], y[i], xm, ym);
Это линия.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,889
Записей в блоге: 2
25.02.2013, 11:54
Цитата Сообщение от iama Посмотреть сообщение
C++
1
2
3
4
5
int min_dist = INT_MAX, closest = -1;
 
for (int i = 0; i < n; i++)
    if (dist(x[i], y[i], xm, ym) < min_dist)
        closest = i, min_dist = dist(x[i], y[i], xm, ym);
Это линия.
Так это перебор всех точек, да еще и реализованный не оптимально (dist дважды). А я ж понял что надо не "короче написать" а чтобы "быстрее считало"
0
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
25.02.2013, 18:31
Igor3D, я показал, что работает за линию. Признайте свою ошибку и уходите. КД-дерево, господи.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,889
Записей в блоге: 2
25.02.2013, 19:59
Цитата Сообщение от iama Посмотреть сообщение
Igor3D, я показал, что работает за линию. Признайте свою ошибку и уходите. КД-дерево, господи.
Может я чего-то не понял, прошу пояснить: как то что Вы показали сокращает время расчета? Перебор всех точек - наихудший (самый медленный) вариант. Или Ваш чем-то от него отличается?
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
25.02.2013, 20:32
Цитата Сообщение от Igor3D Посмотреть сообщение
Может я чего-то не понял, прошу пояснить: как то что Вы показали сокращает время расчета?
По-моему, этот вопрос тебе задан был: как сортировка сокращает время расчёта?
2
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,889
Записей в блоге: 2
25.02.2013, 21:52
Цитата Сообщение от Somebody Посмотреть сообщение
По-моему, этот вопрос тебе задан был: как сортировка сокращает время расчёта?
Не вижу где мне задавали хоть какой-то вопрос Ладно, попробуем посчитать:

N = миллион, полный перебор = миллион вызовов dist. Вариант с сортировкой - 20 спусков (это log(N)). Плюс просмотр вперед-назад. Сколько их будет - хз, зависит от распределения точек. Может всего 2-3, может и все равно почти все, хотя такой случай редкий. Напр для рандомных точек все хорошо. Обычно сначала выбирают "наилучшую ось" (первый ключ сортировки).
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
25.02.2013, 22:30
Цитата Сообщение от Igor3D Посмотреть сообщение
Вариант с сортировкой - 20 спусков (это log(N)).
Сортировка n чисел со сложностью меньше O(n) даже? Совет: не рассказывай никому, пока патент не получишь.
2
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
25.02.2013, 23:41
Igor3D, существуют эзотерические сортировки чисел с асимптотикой https://www.cyberforum.ru/cgi-bin/latex.cgi?O(n\cdot log(log(n))), но асимптотически это, очевидно, хуже линии

Но вы говорите абсолютною чушь по той одной причине, что одно считывание займет https://www.cyberforum.ru/cgi-bin/latex.cgi?O(n) времени, так что лучше линейного решения существовать в теории не может.

Не знаете темы — хоть говорите без апломба и пафоса — не так стыдно потом будет.

Цитата Сообщение от Igor3D Посмотреть сообщение
Перебор всех точек - наихудший (самый медленный) вариант.
Чуть попутали. Это асимптотически лучшее решение.

Не по теме:

Может еще покажете как KD-дерево быстрее, чем за линию писать?

0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,889
Записей в блоге: 2
26.02.2013, 11:49
Цитата Сообщение от Somebody Посмотреть сообщение
Сортировка n чисел со сложностью меньше O(n) даже? Совет: не рассказывай никому, пока патент не получишь.
Так сортировка-то выполняется один раз на фазе предрасчета, а число поисков (для разных "опорных точек") может быть огромно. Разумеется если данные никак не организованы то остается только тупой перебор - для любой задачи.

Цитата Сообщение от iama Посмотреть сообщение
Не знаете темы — хоть говорите без апломба и пафоса — не так стыдно потом будет.
Как говорится "при проверке документов будьте взаимно вежливы" Давайте проверим на деле, чего бросаться словами? Выкладывайте Ваш вариант и засекайте время напр 10K поисков. А я берусь его ускорить
0
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
26.02.2013, 14:38
Igor3D, условие читали? Автору нужно отвечать только на один запрос. Без проблем, я пишу линию и вы попытаетесь её переплюнуть на одном запросе, идет?
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,889
Записей в блоге: 2
26.02.2013, 15:18
Цитата Сообщение от iama Посмотреть сообщение
Igor3D, условие читали? Автору нужно отвечать только на один запрос. Без проблем, я пишу линию и вы попытаетесь её переплюнуть на одном запросе, идет?
"Линия" - это вполне конкретное понятие в геометрии. Употребляя его в др смысле Вы не можете рассчитывать на понимание.

Во-вторых, не вижу где автор говорил об "одном запросе", да и немудрено - такая постановка не имеет никакого смысла. Нельзя строить нужные данные - ну никакого ускорения и не получить. Еще раз обращаю Ваше внимание что речь шла об ускорении, цикл for автор уже благополучно написал и советовать его опять ни к чему.

Также могу сообщить что задача "найти ближайших" встречается в жизни часто и во многих областях, поэтому Ваша неосведомленность меня, право, удивляет. Также все эти "O" - примерно такой же бред как и "блок-схема", применимы только для простейших случаев.
0
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
26.02.2013, 17:45
Цитата Сообщение от Igor3D Посмотреть сообщение
"Линия" - это вполне конкретное понятие в геометрии. Употребляя его в др смысле Вы не можете рассчитывать на понимание.
Это общепринятый профессиональный термин, употреблемый при оценке временной сложности алгоримтов.


Цитата Сообщение от Igor3D Посмотреть сообщение
Во-вторых, не вижу где автор говорил об "одном запросе"
Цитата Сообщение от OClicK Посмотреть сообщение
На ограниченной, но достаточно большой по площади, плоскости есть одна
опорная точка с координатами x0 и y0
Я покажу, мне несложно. Вам осталось только признать свою глупость.

Цитата Сообщение от Igor3D Посмотреть сообщение
Также все эти "O" - примерно такой же бред как и "блок-схема", применимы только для простейших случаев.
Ну это вообще пушка. Даже комментировать не стану.

Добавлено через 1 минуту
Так что, не хотите показать ваше мастерство оптимизации?
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,889
Записей в блоге: 2
26.02.2013, 21:25
Цитата Сообщение от iama Посмотреть сообщение
Я покажу, мне несложно.
Не увидел ничего "показанного" Да, в одном запросе одна опорная точка, в другом уже другая. Если один запрос - проблем со скоростью не возникает вообще, а вот если поиск вызывается многократно - проблемы гарантированы.

Цитата Сообщение от iama Посмотреть сообщение
Вам осталось только признать свою глупость.
Позвольте, а в чем же Ваша "умность"? Предложить перебрать все точки в цикле, да еще и удвоить время вычислений в стремлении записать короче? При всем желании большой мудростью это никак не назвать

Даже если предположить что топик-стартер спрашивал именно об однократном вычислении - все равно Вы неправы, надо ответить: "никак не сократить если ничего нельзя подготовить/предрасчитать". Слово "поиск" автоматически подразумевает ту или иную организацию данных, иначе никакого поиска нет.

Почему автоматически подразумевается что вопрос глупый/глупейший (типа "как найти максимум в массиве")? Не стоит так плохо думать о людях
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2013, 21:25
Помогаю со студенческими работами здесь

Как сократить время работы программы?
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import...

Как сократить время работы программы?
Вот текст олимпиадной задачи: Ваша задача – посчитать сумму двух чисел. Входные данные В единственной строке входного файла...

Как сократить время работы программы?!
Нужно сократить время работы программы по вычислению чисел Фибоначчи: Вот мой код: #include &quot;stdafx.h&quot; #include...

A^b mod m. Как сократить время выполнения ?
Здравствуйте! Рабочий код (вроде), но при проверке разные ошибки типа превышения времени ожидания и тп. Помогите разобраться в чем...

Как сократить алгоритм , что бы ускорить время выполнения
Всем Доброго времени суток ;D Подскажите пожалуйста как можно преобразовать код , либо сократить его для быстродействия? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru