Всё то же самое можно сделать с помощью IntStream
:
int m = 3;
int n = 4;
// массив случайных чисел (n * m)
int[][] arr1 = IntStream.range(0, n)
.mapToObj(i -> IntStream.range(0, m)
// генерируем случайное число
.map(j -> (int) (Math.random() * 10))
.toArray())
.toArray(int[][]::new);
int x = 5;
// поиск координат (x)
int[][] arr2 = IntStream.range(0, arr1.length)
.mapToObj(i -> IntStream.range(0, arr1[i].length)
.filter(j -> arr1[i][j] == x)
// (x) координаты
.mapToObj(j -> new int[]{i, j})
.toArray(int[][]::new))
.flatMap(Arrays::stream)
.toArray(int[][]::new);
// вывод
Arrays.stream(arr1).map(Arrays::toString).forEach(System.out::println);
Arrays.stream(arr2).map(Arrays::toString).forEach(System.out::println);
Вывод:
[7, 8, 5]
[6, 8, 1]
[2, 1, 3]
[5, 1, 5]
[0, 2]
[3, 0]
[3, 2]
I have two ArrayList, Double data type,
1.latitudes
2. longitudes,
each has over 200 elements
say i give a random test coordinates, say (1.33, 103.4), the format is [latitude, longitude]
is there any algorithm to easily find closest point,
or do i have to brute force calculate every possible point, find hypotenuse, and then compare over 200 hypotenuses to return the closest point? thanks
asked Sep 23, 2013 at 17:52
3
Sort the array of points along one axis. Then, locate the point in the array closest to the required point along this axis and calculate the distance (using whatever metric is appropriate to the problem topology and scale).
Then, search along the array in both directions until the distance to these points is greater than the best result so far. The shortest distance point is the answer.
This can result in having to search the entire array, and is a form of Branch and bound constrained by the geometry of the problem. If the points are reasonably evenly distributed around the point you are searching for, then the scan will not require many trials.
Alternate spatial indices (like quad-trees) will give better results, but your small number of points would make the setup cost in preparing the index much larger than a simple sort. You will need to track the position changes caused by the sort as your other array will not be sorted the same way. If you change the data into a single array of points, then the sort will reorder entire points at the same time.
answered Dec 22, 2013 at 17:12
PekkaPekka
3,46926 silver badges45 bronze badges
If your arrays are sorted, you can use binary search to find a position of a requested point in array. After you find index, you should check four near by points to find the closest.
1)Suppose you have two sorted arrays longitudes-wise and latitudes-wise
2)You search first one and find two nearby points
3)Then you search second one and find two more points
4)Now you have from two to four points(results might intersect)
5)These points will form a square around destination point
6)Find the closest point
answered Sep 23, 2013 at 18:16
MikhailMikhail
4,15515 silver badges31 bronze badges
it’s not true that closest lat (or long) value should be choosen to search over the long (or lat) axis, in fact you could stay on a lat (or long) line but far away along the long (or lat) value
so best way is to calculate all distances and sort them
answered Feb 19, 2015 at 9:22
NoomakNoomak
3715 silver badges19 bronze badges
1
Я бы сказал что-то вроде этого:
public static Tuple<int, int> CoordinatesOf<T>(this T[,] matrix, T value)
{
int w = matrix.GetLength(0); // width
int h = matrix.GetLength(1); // height
for (int x = 0; x < w; ++x)
{
for (int y = 0; y < h; ++y)
{
if (matrix[x, y].Equals(value))
return Tuple.Create(x, y);
}
}
return Tuple.Create(-1, -1);
}
Dan Tao
16 июль 2010, в 00:27
Поделиться
Вот метод, который должен найти индекс в массиве с произвольным рангом.
… Добавлен диапазон верхних/нижних границ для ранга
public static class Tools
{
public static int[] FindIndex(this Array haystack, object needle)
{
if (haystack.Rank == 1)
return new[] { Array.IndexOf(haystack, needle) };
var found = haystack.OfType<object>()
.Select((v, i) => new { v, i })
.FirstOrDefault(s => s.v.Equals(needle));
if (found == null)
throw new Exception("needle not found in set");
var indexes = new int[haystack.Rank];
var last = found.i;
var lastLength = Enumerable.Range(0, haystack.Rank)
.Aggregate(1,
(a, v) => a * haystack.GetLength(v));
for (var rank =0; rank < haystack.Rank; rank++)
{
lastLength = lastLength / haystack.GetLength(rank);
var value = last / lastLength;
last -= value * lastLength;
var index = value + haystack.GetLowerBound(rank);
if (index > haystack.GetUpperBound(rank))
throw new IndexOutOfRangeException();
indexes[rank] = index;
}
return indexes;
}
}
Matthew Whited
16 июль 2010, в 01:22
Поделиться
Ещё вопросы
- 0ключевое слово на элементах встроенного блока
- 0Отправить подтверждение в anjularjs
- 0SQLPro или PostgreSQL SQL обновление строки на основе предыдущего значения строки
- 0javascript / jquery получить значение переменной [дубликата]
- 0JQuery выберите раскрывающийся список выбранного значения
- 1Позвоните классу через минуту после инициализации Eclipse
- 1Почему действие возвращается к предыдущему, когда я получаю данные из базы данных?
- 0Как использовать попсовер AngularStrap в сервисе
- 1Ошибка конфигурации приложения службы WCF
- 0Символ PortAudio не найден: _PaMacCore_SetupChannelMap на Mountain Lion
- 0MySQL триггер для отправки HTTP POST-запроса
- 0Как определить причину сбоя с помощью windbg (ntdll! KiFastSystemCallRet)?
- 0Тестирование углового модала открытое обещание
- 1Задание Ant JUnit не запускает тесты Spring – бегун класса Spring не найден
- 0Почему не работает моя быстрая сортировка
- 0Laravel репозиторий для рекурсивной функции меню
- 0Как я могу получить и установить выбранный переключатель во внешнем HTML-контенте с помощью ActionScript?
- 0Проблема с повторяющимися кнопками поля формы
- 0MySQL объединяет три таблицы
- 1Вход на веб-страницу из Java
- 0HTML-форма для загрузки папки FTP
- 1Асинхронная загрузка в Azure не блокируется даже при вызове Task.WaitAll (задача)
- 1Итерация по файлу с чтением первых N значений
- 1Получить IP-адрес из последней строки файла журнала, используя Regex
- 1Клиент SignalR js неправильный порт сервера
- 0Кнопка «Нравится» / «Рекомендовать» на Facebook не показывает правильную ссылку на лайк или изображение
- 0Маржа не отображается должным образом
- 1Значение не печатать
- 1RegEx: Как захватить подраздел
- 0Вызов href из JavaScript
- 0Как мне запустить этот скрипт в MYSQL?
- 0ион-бесконечный свиток терпит неудачу с ионным
- 1Как я могу получить Access-Token и Access-Token-Secret?
- 1Выберите / Option / Value при изменении, используя Classic ASP
- 0Статическая инициализация члена класса шаблона
- 0Как вычесть две даты в php [дубликаты]
- 1Рисование TextBox
- 0PHP-SQL Подготовленные операторы с переменным числовым именем таблицы [дубликаты]
- 1Как изменить цвет фона для определенных элементов виджета в RecycleView?
- 1Ищет наличие составного ключа в трех DataFrames и соответственно объединяет DataFrames
- 1Невозможно получить команду оболочки ADB с путем, работающим в оболочке Windows
- 0Диапазон значений HSV для выборки изображения, как сделано Adobe
- 0mysqldump ошибка 1728 при автоматическом выполнении резервного копирования
- 1Проблема с запуском файла класса java, содержащего зависимость Jsoup
- 0Лучший способ связи между настольным приложением и службой Windows
- 0Компиляция кода ошибки из Learning Modern 3D Graphics Программирование неразрешенного внешнего символа _main, на который ссылается функция ___tmainCRTStartup
- 0Получить innerHTML из динамически добавленного тега скрипта
- 1разделять / разбивать значения строк и формировать отдельные строки
- 1Как уменьшить / изменить задержку после сканирования?
0 / 0 / 0 Регистрация: 05.02.2022 Сообщений: 24 |
|
1 |
|
Нужно найти координаты элемента в двумерном массиве27.05.2022, 20:23. Показов 827. Ответов 1
Есть двумерный(int[,]) массив, с клавиатуры вводим один из элементов массива и нам выдает его координаты Изображения
0 |
wizard41 2133 / 1412 / 446 Регистрация: 04.09.2018 Сообщений: 5,019 Записей в блоге: 2 |
||||
27.05.2022, 20:38 |
2 |
|||
Сообщение было отмечено Blackache как решение Решение
1 |
Доброго всем дня.
Прохожу курс по алгоритмам и одно из заданий таково:
Даны отрезки вида [x, y], где x – координата начала отрезка, а у, соответственно, координата конца. Также дан массив точек [x1, x2, x3, … , xn]. Необходимо определить в каком количестве отрезков содержится каждая точка. Задание находится в теме “Быстрая сортировка” и очевидно, что использовать нужно её, но я не понимаю, с чего нужно начинать.
Наивный алгоритм за O(n^2) ясен, для каждой точки пробегаемся по всем возможным отрезкам.
Далее приведу свои дальнейшие рассуждения по прикручиванию быстрой сортировки:
1. Сортировать массив точек не имеет смысла, так как выдавать результат по каждой точке необходимо в порядке появления её в потоке ввода.
2. Объединять все массивы отрезков в один также не имеет смысла, потому что тогда мы не сможем контролировать начало и конец отрезка, так как все смешается в упорядоченную кашу.
3. Создать два массива для начал и концов отрезков ( 1: [x1, x2, x3, … , xn], 2: [y1, y2, y3, … , yn]
Отсортировать их с помощью “быстрой” сортировки (используя тройное разделение для ускорения сортировки повторяющихся элементов) и…
Что делать дальше мне не совсем понятно. Просто последовательно проходить по упорядоченным массивам [x] и [y] для каждой точки, тем самым получив число отрезков, в которые точка входит или как?
Буду признателен за любую помощь.