@Sneiksus

Как оптимизировать алгоритм с Эвклидовым расстоянием?

public static char[,] fields = new char[10000, 10000]; // содержит 't'  и 'r' символы
List<Tuple<int, int, double>> tuples = new List<Tuple<int, int, double>>();
        for (int i = 0; i < 10000; i++)
        {
            for (int r = 0; r < 10000; r++)
            {
                if (fields[i, r] != 't')
                    tuples.Add(Tuple.Create(i, r, Math.Sqrt(Math.Pow(i - x, 2) + Math.Pow(r - y, 2))));
            }
        }


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

UPD: чтобы не считать дистанцию для точек два раза, поменял
int r = 0
на
int r = i
, но сильного эффекта это не дало.

UPD2: нельзя ли это ускорить аппаратно? Например использовав GPU?
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
GavriKos
@GavriKos
Ну про квадрат расстояния уже сказали.
Далее - tuples проинициализируйте каким то количеством. Потому что на Add при аллокации съедите много времени.
Ну перебор конечно конский - посчитайте количество итераций, их многовато как то ) Но тут вряд ли что то сделаешь, хз. Надо читать задачу. Может можно ограничить эти итерации.
Дальше. Не видно где меняется x и что это такое, но выглядт так что Math.Pow(i - x, 2) можно вычислить до внутреннего цикла.

Я бы еще попробовал убрать Create у тупли - тоже аллокация.

НАсчет ГПУ. У вас кроме корня (который не нужен) судя по всему нет дробных чисел (хотя мы не знаем что такое x и y) - поэтому именно использование ГПУ тут не даст космического прироста. А вот второй цикл похоже можно распараллелить. На чем параллелить - без разницы
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Не ищите расстояние, ищите квадрат расстояния.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы