0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 20
|
|
1 | |
Массив: Элемент считается равным другому, если его данные лежат в пределах некоего диапазона, сравнить массивы29.04.2017, 21:39. Показов 1240. Ответов 17
Метки нет (Все метки)
Всем привет. Есть 2 массива данных, которые необходимо сравнить на степень подобия, подскажите пожалуйста как это сделать.
Каждый элемент массива храниться в виде точки и целочисленного значения (например 1 элемент вида: point(4,7) и int(155)). Сложность заключается в том, что элемент считается равным другому, если его данные лежат в пределах некоего диапазона т.е. если х1=155, у8=142 и если |155-142|<15 то элементы равны. При этом элементов в обоих массивах может быть разное количество (например 132 и 55, при этом с первым массивом совпало 45 из 55). Заранее благодарю.
0
|
29.04.2017, 21:39 | |
Ответы с готовыми решениями:
17
Необходимо каждый элемент массива сравнить с его 8 соседями и если он больше, чем любой из элементов с которыми сравнивается, его распечатать. Сравнить элемент матрицы с числом, и если он больше, то заменить его на другое число Каждый элемент массива сделать равным его сумме с предыдущим элементом Если словарь при объявлении инициализируется, его начальная емкость становится равным инициализируемому? |
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
29.04.2017, 21:41 | 2 |
че такое степень подобия, что вообще значит сравнить два разных массива?
0
|
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
|
|
29.04.2017, 21:46 | 3 |
Ну и, берете первый массив, и прогоняете все его точки по очереди сравнивая каждую точку первого массива со всеми точками второго массива. Приблизительное сравнение тут не сильно усложняет задачу.
И соответственно устанавливаете флаг сравнения для точек первого массива true, false попадает не попадает. В каком виде нужен результат...
0
|
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 20
|
|
29.04.2017, 22:14 [ТС] | 4 |
Чтобы было нагляднее приведу пример.
Например: "х" массив (point, int) 1. (2,5) 9 2. (22,6) 15 3. (66,1) 11 4. (12,62) 15 5. (32,51) 11 6. (17,16) 15 "у" массив (point, int) 1. (22,6) 9 2. (17,16) 18 3. (2,11) 9 "Разброс" для point = 5 "Разброс" для int = 3 Итого, совпало для меньшего массива 1 из 3х: не равны: х2[(22,6), 15] != y1[(22,6), 9] т.к. |15-9|!<3 равны: х6[(17,16), 15] = y2[(17,16), 18] т.к. |18-15|<=3 не равны: х1[(2,5), 9] != y3[(2,11), 9] т.к. |11-5|!<5 Каким образом хранить такие данные "вместе" (кроме БД), чтобы было возможность сортировать их по любому из столбцов? В примере имеем степень подобия 33.3(3)% ? Как организовать сравнение данных? Добавлено через 2 минуты xoraxax, вот в этом и вопрос)))) каким образом можно определить насколько эти массивы подобны? Добавлено через 3 минуты v777779, Не совсем подходит, так как возможно соответствие нескольких элементов одного массива другому, из-за диапазона в котором данные считаются равны. т.е. х1=у1, х1=у6 или у7=х1, у6=х1. Может определить как-то какой из элементов "подобнее", в таком случае? Добавлено через 2 минуты v777779, результат нужен хоть в каком-нибудь виде: проценты, целочисленное, картошка)))) главное, чтобы показывало не просто, что они подобны, а в какой степени.
0
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
29.04.2017, 22:47 | 5 |
ты говоришь на каком-то своем непонятном никому языке, определи "степень подобия", "массивы подобны", "разброс" и все остальные слова, которые могут быть непонятны окружающим, потом можно будет с тобой разговаривать по-человечески.
класс написать?
0
|
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 20
|
|
30.04.2017, 00:17 [ТС] | 6 |
"степень подобия" это что-либо (показатель какой), что будет показывать сколько элементов одного массива условно равны элементам другого. Например, массивы совпадают на 45%, с коэффициентом 563 и т.п. (что предложите? можно пофантазировать в пределах адекватного ;b). При этом следует учитывать вышеназванные особенности сравнения.
"разброс" это допустимая разница (макс. отклонение значения, порог) между данными одного типа. В данном случае каждому элементу массива соответствует пара int и point, по которым и идет сравнение. Если разница по модулю между "int" пары элементов не превышает порог (лежит в пределах этого значения), и, если в то же время условие выполняется и для "point", то элементы условно равны (читай равны). "массивы подобны" - читай равны, похожи с неким коэффициентом подобия. Не написал прямо "равны" т.к. сравниваемые массивы могут иметь разный размер относительно друг друга (например 2 массива - 145 и 33 элемента) и не все элементы могут совпасть (для того же случая (145 и 33): совпало 23 элемента). Нет. Речь шла о том в каком виде хранить данные массива: ArrayList, Object или ещё что порекомендуете. Важно чтобы была возможность хранить разнотипные данные и сортировать по различным столбцам (как в MySQL, например, когда есть столбцы id, int, ....)
0
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
30.04.2017, 00:36 | 7 |
Допустим, в одном массиве есть две точки, у одной инт 6, у другой 9, в другом - одна точка у нее инт 7, погрешность 2. Какую из 2 точек сравнивать с другой? Допустим мы выбрали точку с инт 9. И сказали, что она равна точке с инт 7. Дальше она не участвует в сравнении? Что будет если во втором массиве окажется инт 10?] Что делать, если у точек инт одинаковый? Сравниваются только точки, которые расположены на минимальном расстоянии друг от друга, или все? Координаты вообще как-то участвуют в сравнении? Наверно проще тебе объяснить и нарисовать, что ты пытаешься сделать, пока какая то каша.
Про хранить, пишешь класс с полями point и int, создаешь лист из объектов этого класса и хранишь
1
|
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 20
|
|
30.04.2017, 01:22 [ТС] | 8 |
xoraxax, Вот, собственно, над этим и бьюсь. Сравнивать или нет точку, если она уже совпала с другой?
Учитывать ли уже сравненные точки? Сравниваются только точки, которые расположены на минимальном расстоянии друг от друга? ))))) Может есть какая методика для таких сравнений. Если int одинаковый то точки равны. По сути берем одну точку за эталон (например из массива 1), вокруг которого есть область допуска. Определяем, попадает ли вторая точка в эту область. Если попадает, то зэр гут. Несомненно. Если point и int запутали, то можно взять double и int. Просто условия "равенства" должны выполниться одновременно для обоих параметров элемента массива (пусть уж будет int и double), чтобы элемент признать "равным" другому. Понимаю, задача нетривиальная. Это как с человеком: показываешь картинку или фильм, и он говорит что это на что-то конкретное похоже (например сюжет одного фильма похож на другой), хотя данные могут сильно отличаться. Если абстрагироваться от int-ов, где-нибудь сравнивались массивы разной размерности? Как вообще возможно сравнить массивы на степень подобия, если в каждом разное количество элементов? Спасибо. +1. осталось разобраться с остальным.
0
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
30.04.2017, 01:31 | 9 |
Задачу какую пытаешься решить?
0
|
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 20
|
|
30.04.2017, 01:38 [ТС] | 10 |
xoraxax, Сравнить 2 набора векторов.
Изобразил схематически))) Например красные с синими. Это близко к сути моей задачи)))
0
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
30.04.2017, 01:56 | 11 |
Т.е. вектора на самом деле трехмерные, это ты взял какой то неподходящий тип? Для каждой пары точек ищи расстояние между ними, бери минимальное. Потом останется посчитать, сколько расстояний попадает в погрешность. Можно, наверно, подумать, как исключить часть векторов из сравнения. Ночью чет плохо думается.
0
|
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 20
|
|
30.04.2017, 02:12 [ТС] | 12 |
xoraxax, Не совсем трехмерные. Есть длина вектора и угол поворота (как в полярной системе координат), но изначально нет "пар векторов" для сравнения. Вся группа синих векторов может быть повернута относительно центральной точки на произвольный угол. В таком виде не понятно даже человеку, похожи ли оба набора векторов друг на друга))) Но, если правильно набор повернуть, то визуально появляются пары векторов (это если их будет немного, если много то будет то же месиво). Вот как определять тогда где пара для сравнения и на какой угол повернуть надо (если это вообще требуется). Я явно не первопроходец в этой области. В общем чувствую, что решение рядом, но ничего стоящего на ум не приходит :-(
0
|
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
|
|
30.04.2017, 09:13 | 13 |
полагаю вам сюда http://smirnov.spb.su/papers/three_sets.php
или сюда https://habrahabr.ru/post/115147/
0
|
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 20
|
|
30.04.2017, 13:42 [ТС] | 14 |
v777779, Спасибо. Изучил материал. Возможно стоит использовать класс HashSet метод retainAll.
Тогда, создаем три столбца id, int, double. Находим пересечение массивов по int, затем по double. Затем по id находим те элементы, которые встречаются в пересечениях и int и double. Только это сработает если int первого массива строго равен int второго. Как быть если они должны быть равны с некоторой погрешностью? Возможно ли модифицировать сам метод retainAll для этих целей?
0
|
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
|
|
30.04.2017, 17:16 | 15 |
В своем классе, который будет элементом массива переопределите функцию equals и там сделайте все что хотите с сравнением.
И тогда retainAll будет работать так как Вы хотите.
0
|
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 20
|
||||||
01.05.2017, 13:52 [ТС] | 16 | |||||
Пытался переопределить, но не получилось
В хеш функции требует Int a у меня Double. В equals не совсем ясно что писать в if(). Помогите "добить", пожалуйста. Пока что получилось вот так:
0
|
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
|
|||||||||||
01.05.2017, 15:28 | 17 | ||||||||||
Сообщение было отмечено Robinzonkruzo как решение
Решение
Судя по коду Вы поменяли условия задачи.
Давайте по шагам и по коду. Есть массив a[] и массив b[] Вы преобразовали каждый из них в пару HashMap: a[] => arrdist1, arrangle1 b[] => arrdist2, arrangle2 Теперь Вам надо найти пересечение, всего этого по правилу: 1. вытащить arrdist1(key0) сравнить расстояние поочередно со всеми элементами arrdist2 2. вытащить arrangle1(key0) сравнить расстояние поочередно со всеми элементами arrangle2 3. Если расстояние по дистанции меньше некоей величины1 и расстояние по углу меньше некоей величины 2, то элементы считаются равными 4. retainAll должна работать так, чтобы после прогона всего arrdist1, arrangle1 нужно получить пересечение в любом виде, то есть совпадающие элементы для всех HashMap 5. полученное пересечение куда то сохранить. Вопросы: 1. верный ли алгоритм. 2. где значения констант расстояний для дистанции и угла Добавлено через 56 минут Вот реализация
1
|
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 20
|
|
01.05.2017, 16:36 [ТС] | 18 |
v777779, очень признателен за оказанную помощь в решении задачи! Без Вашей помощи мне самому ни за что бы не справиться, поскольку изначально у меня не было четко сформулированного алгоритма ее решения. Также, отдельно хочу поблагодарить xoraxax. Очень ценю Ваш профессионализм. Еще раз огромное спасибо!!!
0
|
01.05.2017, 16:36 | |
01.05.2017, 16:36 | |
Помогаю со студенческими работами здесь
18
Если элемент не найден, то вставить его в массив на первое место Дан массив символьных строк. Найти количество двухзачных чисел. Числа в строках лежат в пределах от -10000 до 10000 В массиве из 8 целых чисел определить максимальный элемент и поменять его с третьим элементом, равным 0 Массивы. Получить новый массив, каждый элемент равен сумме исходного элемента и его индекса Бинарный поиск. Если элемент не найден, то вставить его в массив на второе место Как можно взять один элемент двумерного массива и сравнить его с элементами его строки? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |