Добрый день. Есть массив данных. Как в нем найти минимальное количество цифр, с условием что хотя бы одна из них будет в каждой строке. Для примера в представленном массиве это будут: 1, 8 и 10 но возможно ли их как-то найти автоматически посредством формул или макроса? Спасибо.
Как найти минимальное количество общих цифр в массиве данных, Как найти минимальное количество общих цифр в массиве данных
27.04.2019 16:50:07
|
|
|
|
27.04.2019 20:02:18
|
|||
|
|
27.04.2019 23:00:51
mayer4, боюсь, вас даже медведь не поймёт, а уж на что крутой спец по распознаванию.
Опишите шаг шаг шагом, как задаётся тот самый набор цифр? Почему именно этот? Почему в примере число 10 встречается 6 раз, что больше чем встречается число два (2 раза). Тогда почему 6 < 2? Или вы используете некоторое своё собственное определение меньше/больше? Переведите... |
|
|
|
27.04.2019 23:03:05
|
|||
|
|
28.04.2019 00:07:54
|
|||
|
|
28.04.2019 00:56:57
Вариант, как понял.
|
|
|
|
28.04.2019 08:49:43
Включил Be
Если кто не понял условия, то ищется минимальная по количеству комбинация чисел от 1 до 10,которая удовлетворяет условию, что во всех строках должно присутствовать, хотя бы одно число из этой комбинации. Думаю формулы бессильны, так как нужно включить комбинаторику, и , При этом K меняется от 1 до 10 что получим в районе 1000 комбинаций, что не так страшно, и если б не сложность генерации этого формулой, то не проблема, а так нужен макрос. Проверить на наличие в строке одного числа или комбинации и далее проверить что б по всем строкам было хоть одно вхождение - не проблема.
Изменено:
По вопросам из тем форума, личку не читаю.
|
|||
|
|
28.04.2019 09:52:15
Возьмём первый файл ТС. Какое число от 1 до 10 есть в каждой строке? 10 есть только Цикл 1-Цикл 5, Цикл 10. Аналогично и с остальными. Тогда условие
Второе. Пусть 10 есть в каждой строке Цикл 1- Цикл 10, тогда все числа, которые попадаются в любой из строк удовлетворяют условию и для первого файла имеем минимальный набор из 1-9. Почему тогда у ТС только 1, 8, 10?
Изменено: |
|||||||
|
|
28.04.2019 11:10:07
Я вот до сих пор не могу понять задачу ))
|
|
|
|
28.04.2019 13:25:31
Михаил, спасибо за перевод на человеческий язык.
P. S. Крайне не рекомендуется запускать на сильно заполненной таблице. Алгоритм строит все пути, на сильно заполненном будет 10^10 вариантов путей. Можно несколько оптимизировать, на каждом шаге отбирая пути по минимальному количеству узлов предыдущего шага. Оставлю это ТС - ему тоже надо чем то в своей задаче поделать, а то будет скучно.
Изменено: |
|||
|
|
28.04.2019 14:12:56
|
|
|
|
28.04.2019 14:34:07
Соответственно, пусть в первой строке 10 чисел и во второй 10 чисел. Тогда для каждого числа из первой строки есть 10 путей во вторую строку. Всего 10^2, где 2 число строк. Отсюда в пределе для 10 строк 10^10. А уж отбираем в пути с 1 по 10 строку только уникальные числа. То есть если дважды/трижды и так далее в пути от первой строки к десятой встретилась 1, то учитываем её один раз. Таким образом в пути останутся только уникальные числа. Построив все пути, отберём такой, у которого наименьшее количество чисел и выведем его.
Изменено: |
|||
|
|
28.04.2019 15:16:58
Понятно, я б конечно пошел по тому пути что пошел.
К слову, если о количестве говорить, то можно и формулами попробовать, Но пока ТС не сказал, что нужно получить 3 или комбинацию ( а их в примере 2), делать не хочется.
Изменено:
По вопросам из тем форума, личку не читаю.
|
|
|
|
28.04.2019 15:47:22
Здравствуйте, коллеги! #16 - впечатляющий пример возможностей формул.
Задачу можно сформулировать так. Есть матрица (не обязательно квадратная) из нулей и единиц, причем в каждой строке и каждом столбце есть хотя бы одна единица. Выделить минимальное множество столбцов так, чтобы для каждой строки нашелся выделенный столбец, на пересечении с которым стоит единица. Что-то знакомое из линейного программирования... Можно решать рекурсивно перебором, начиная со строк с минимальным числом единиц. Варианты хуже ранее найденного можно сразу отбрасывать.
Изменено:
Владимир
|
|
|
|
28.04.2019 16:50:17
Михаил, спасибо. Отличное решение. Только вот фантомные истины присутствуют.
|
|
|
|
28.04.2019 17:03:33
sokol92, Владимир, нет предела
=SMALL(IF(MMULT(TRANSPOSE(--(BITAND(MMULT(($B$3:$K$12>0)*2^(10-COLUMN($B$2:$K$2)+1);ROW($A$1:$A$10)^0);TRANSPOSE(ROW($A$1:$A$1024)))>0));ROW($A$1:$A$10)^0)=10;ROW($A$1:$A$1024));ROW(A1)) Находит десятичные числа, которые удовлетворяют, осталось только найти единички и минимальное их количество. В процессе :-)
По вопросам из тем форума, личку не читаю.
|
|
|
|
28.04.2019 22:58:51
Здравствуйте. Спасибо всем огромное за помощь в решении моей проблемы!!!! Извините если не смог совсем корректно сформулировать требуемую задачу.
|
|
|
|
29.04.2019 00:23:12
Чисто Формульное решение для 10x10. Для краткости в имена пришлось кое что спрятать, ну и без промежуточного решения не получилось
По вопросам из тем форума, личку не читаю.
|
|||
|
|
29.04.2019 00:27:55
Нужна именно минимально возможная комбинация при этом количество цифр в ней может быть любой не обязательно три.
Изменено: |
|
|
|
29.04.2019 01:08:41
Спасибо!!!
|
|
|
|
29.04.2019 09:38:02
"Темная сторона силы" помогла с UDF.
1. для 10x10 считает почти мгновенно, а вот 20x20 задумывается 2. для примера 10x10 выдает 1,4,10, а не 1,8,10, что не ошибка, просто это второй набор.
Сравнил варианты, ну что могу сказать, с учетом того что я не макрушник, результат по скорости меня радует и сильно.
По вопросам из тем форума, личку не читаю.
|
|||
|
|
29.04.2019 10:17:35
Чуть подполировал свой вариант на графах. Ему без разницы, квадратная ли матрица на входе или нет. Главное чтобы выделение было прямоугольным. |
|||
|
|
29.04.2019 10:26:05
о, убрал еже обработку заведомо ненужных вариантов, время получил равное тому что у Вас в последней версии.
Изменено:
По вопросам из тем форума, личку не читаю.
|
|||
|
|
29.04.2019 11:20:02
Выигрыш на на цикле 2 ^ 20 - 0,36 секунды против 2,30 секунды. Перевёл бы все 2 ^ (j - 1) в однократно вычисленные массивы констант. Операция возведения в степень одна из самых дорогих. Хуже только тригонометрия. |
|||||
|
|
29.04.2019 11:26:14
|
|
|
|
29.04.2019 11:31:09
Андрей VG, Спасибо, сейчас 20x20 считает на моем компе примерно 1 сек. ранее было почти 5 , а до этого было совсем грустно.
Возведение в степень свел к минимуму, там и до этого было не много, разово массив заполнялся, и финальная комбинация бралась, - это гроши но всеж.
Изменено:
По вопросам из тем форума, личку не читаю.
|
||||
|
|
|||