Всем доброе время суток! У меня есть список LIST, где хранятся значения координат. Также у меня есть участок, например 2000м на 2000м, который разбили на более мелкие участки (25 на 25 метров). Из этого исходя у меня есть сетка 80 на 80, куда мне ну;yj разместить точки из списка и подсчитать, сколько этих точек находится на каждом из этих маленьких участков (который 25 на 25 метров)
Я сделал следующий алгоритм, но на таких объемах, какие я указал в примере, программа тратит кучу времени и ресурсов для выполнения этих действий. Точек в списке примерно 400-600:
for (int i = 0, i1 = 0; i < 2000 && i1 < 80; i = i + 25, i1 += 1)
{
for (int j = 0, j1 = 0; j < 2000 && j1 < 80; j = j + 25, j1 += 1)
{
//CountSelectedPointsInBin список координат
// выполняю linq запрос по расчету суммы точек на нужном маленьком участке
int multip = CountSelectedPointsInBin.Where(p => p.PointX >= i && p.PointX <= i + SizeBinX && p.PointY >= j && p.PointY <= j + SizeBinY).Sum(p => p.NumRect);
// загоняю все в массив
arrayBin[i1, j1] = multip;
}
Как можно оптимизировать этот код?? Или вообще сделать по другому, чтобы программа быстрее выполняла такие не сложные операции?
public static List<PointsSelectedObjects> CountSelectedPointsInBin
{
get
{
if (selectedPointsInBin.Count != 0) return countSelectedPointsInBin;
else return null;
}
}
public static void CountintsInBin()
{
countSelectedPointsInBin = new List<PointsSelectedObjects>();
for (int i = 0; i < selectedPointsInBin.Count; i++)
{
double coordX = 0, coordY = 0;
for (int j = 0; j < selectedPointsInBin.Count; j++)
{
if (selectedPointsInBin[i].PointX == selectedPointsInBin[j].PointX && selectedPointsInBin[i].PointY == selectedPointsInBin[j].PointY)
{
countPoints++;
coordX = selectedPointsInBin[i].PointX;
coordY = selectedPointsInBin[i].PointY;
}
}
PointsSelectedObjects points = new PointsSelectedObjects(coordX, coordY, countPoints);
countSelectedPointsInBin.Add(points);
countPoints = 0;
}
}
Его я вызываю на форме и он подсчитывается нормально.
Вот класс этих координат:
public class PointsSelectedObjects
{
double pointX;
double pointY;
int numRect;
int countPoints;
public PointsSelectedObjects(double x, double y, int countPoints, bool point = false)
{
pointX = x;
pointY = y;
this.countPoints = countPoints;
}
И там еще есть public свойства этих перемен (get и set)
list
- ваш массив с точками.
arr
- массив полей. Значение — количество попаданий
var arr = new int[80, 80];
list.ForEach(t => arr[(int)(t.X / 25), (int)(t.Y / 25)]++);
Время выполнения: O(n).
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть консольное приложение, в котором нужно копировать файлы по локальной сети как с аутентификацией так и безЗнаю, что без аутентификации...