Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перебор всех возможных комбинаций, из многомерного массива 
:(
    Опции темы
Resident
  Дата 28.10.2009, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 25.9.2006

Репутация: нет
Всего: 0



На входе задается строка

1|2|3|4
5|6|7|8

из нее формируется массив

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 5
        )

    [1] => Array
        (
            [0] => 2
            [1] => 6
        )

    [2] => Array
        (
            [0] => 3
            [1] => 7
        )

    [3] => Array
        (
            [0] => 4
            [1] => 8
        )

)

Принцип генерации я думаю понятен, каждая колонка собирается в отдельный массив. Колонок может быть больше, может быть меньше. Т.е. не фиксировано 4шт. Так же строк может быть одна и более. В соответствии с полученной на входе строкой формируется соответствующий многомерный массив. Далее нужно перебрать все возможные комбинации по принципу кодового замка с барабанами, которые нужно крутить. На выходе для приведенного выше массива должны получиться комбинации:

1234
1238
1274
1278
1634
1638
1674
1678
5234
5238
5274
5278
5678
5638
5674
5678

Как такое можно сделать?  smile 

Это сообщение отредактировал(а) Resident - 29.10.2009, 18:45
PM   Вверх
Akina
Дата 28.10.2009, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Тут две задачи - формирование масссива и вывод перестановок.
Какая вызывает проблемы?
PS. Обе неоднократно обсуждались в форуме. Поиск поможет.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Resident
Дата 28.10.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 25.9.2006

Репутация: нет
Всего: 0



C формированием массива проблем нет. Проблема как раз с перебором всех возможных значений из получившегося массива, как описано выше.
PM   Вверх
Akina
Дата 28.10.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



При неизвестном количестве элементов - рекурсия или псевдорекурсия.
Поиск по форуму поможет. Если на поиск не хватит таланта - то хотя бы см. темы в самом низу этой страницы.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Alexk553
Дата 14.1.2010, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 8.11.2009

Репутация: нет
Всего: нет



Недавно для себя решил подобную задачу. на входе есть массив строк, например, из 30 строк. Задача - составить все возможные их комбинации с повторами, начиная с одной строки, потом две строки, потом три, и.т.д. Результирующая строка куда-то там выводится. Рекурсию я отверг, потому что лёгкость алгоритма рекурсии нивелируется сложностью восстановления вычислений. например, мы перебрали 10000000000 комбинаций, и требуется перезагрузить машину. Поэтому никаких рекурсий, только итерации. 
Реализуется просто: главное - это число - итератор. его тип лучше брать целое , 64 или 128 битное. В Си++ это __int64 или, если позволяет архитектура, __int128.  пишем стандартный цикл с инкрементированием. 

в теле цикла организуем другой цикл, где делим итератор нацело на число элементов в массиве, например, на 30. запоминаем последовательность. когда результат деления ноль, записываем остаток.
например итератор - последовательность (делим на 30).

15 - 0,15
45 -1,15
46 - 1, 16
31 - 1, 1
и.т.д.

эта последовательность есть индексы массива. очевидно, что таким образом будут перебираться все возможные сочетания элементов друг с другом.

преимущество - быстрота, запоминание результата. в отличие от рекурсии не тратится время на занесение в стек. На core2 duo 3 GHz в однопоточном варианте сама вычислительная часть перебирала 20 000 000 комбинаций в секунду.

моя задача проще, но я показываю, что можно обойтись и без рекурсии. В данном случае массив чётко задаёт последовательность на выходе, а значит, существует итератор, который однозначно определяет комбинацию. 

для адаптации описанного выше япод эту задачу я бы сделал так. число строк (в приведённом автором примере их две) - это число элеметов в массиве. а вот отличие в том, что в моём примере индекс был для линейного массива, а тут во внутреннем цикле (где идёт деление нужно его инкремент хзапоминать для каждого акта деления, это будет вторым индексом для обращения к двумерному массиву).

Удачного взлома! 

Это сообщение отредактировал(а) Alexk553 - 14.1.2010, 13:39
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.