Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Перестановки алфавита без рекурсии. Без массивов. PHP
Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014
Помог: 10 раз(а)
Ребята, если кому-то будет интересна эта тема, вот мои наработки.
Пока, вроде, получилось. Правда, есть ограничение на генерируемые размещения.
Собственно, заметка о том, как превратить размещения в перестановки.
Все алгоритмы, которые я встречал в Интернете на ключевые слова "перестановки и permutations" мне показались сложными для понимания. Заодно отталкивает использование рекурсии. Работая над другим скриптом, пришел к следующему выводу.
Чтобы получить все перестановки, которые, как известно, равны факториалу n!,
сначала надо получить все размещения с повторениями. Мной был найден такой скрипт и несколько переделан, взят с hashcode, автора не помню.
Мы генерируем все размещения в данном случае 4-х элементов - abcd. Для этого используется цикл до 4 в степени 4 (все размещения с повторением). Данные преобразуются в четверичную систему, дописываются нули слева. Затем с помощью strtr преобразование в abcd. Вот, с первым скриптом все.
А дальше?! Надо удалить из всех размещений каждую строку, в который символ повторяется. Второй скрипт читает из файла f.txt построчно, проверяет количество одного символа в строке и записывает в промежуточный файл только те строки, в которых символ один. Когда цикл переберет все записи на одну букву, подставит другую. Первый цикл - перебора массива - будет иметь столько итераций, сколько всего букв в алфавите, т.е. n. Иначе говоря, есть abcd - 4 буквы, у цикла перебора массива будет 4 итерации.
Промежуточные вычисления записываются в дополнительный файлы, потом файлы удаляются и переименовываются.
Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014
Помог: 10 раз(а)
Еще такой вариант получения перестановок, полуавтоматический. Не знаю, где может пригодиться. Идея такая: можно генерировать любой набор букв рандомно.
Например, при помощи скрипта из этой статьи: http://www.php.su/articles/?cat=...les&page=052
Писать этот набор в файл, другим скриптом отсеивать все строчки, в которых 1 буква встречается более одного раза, а затем применять arrar_unique для поиска уникальных.
Второй вариант без рекурсии, где сначала надо найти все размещения с повторениями, сгенерирует до 7 включительно, так как понятно разм. с повторениями намного больше.
Пример, если всех перестановок семи элементов abcdefg - 7! = 5040, то размещений 7⁷ = 823543. Т.е. вариант долгий и нудный, но он есть.
Вариант третий можно автоматизировать, он совсем долгий (почти бесконечный ) Один скрипт генерирует n-ое количество случайных выборок и сохраняет в файл, другой скрипт забирает результат удаляет то - что не попадает под перестановку, например aaabc, потом удаляет повторы, опять же можно сохранять в другой файл, который будет базой
Третий скрипт находит все перестановки 4 эл. за 100 рекурсивных вызовов. (Добавление)
Tyoma5891 пишет:
у меня такое подозрение, для побора паролей, но для этого достаточно тупого перебора методом +1 )
Причем тут перестановки и перебор? При перестановках вы не получаете перебора всех значений.
Третий вариант интересен тем, что последовательность перестановок будет случайной.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.