Python: все возможные слова (перестановки) фиксированной длины в мини-алфавите - PullRequest
2 голосов
/ 01 июля 2011

Допустим, у меня есть такая строка:

abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()-_+={}[]\:;"'?/>.<,`~|€

В основном это список всех символов на моей клавиатуре. Как я мог получить все возможные комбинации, скажем, для «слова», состоящего из 8 из этих символов? Я знаю, что будут миллионы возможностей.

ура!

1 Ответ

8 голосов
/ 01 июля 2011

Разница между перестановками и комбинациями

Вы ищете перестановку или комбинацию.

'abc' и 'bac' - это разные перестановки, но они представляют собой одну и ту же комбинацию {a,b,c}.

Перестановки 'abc': '', 'a', 'b', 'c', 'ab', 'ba', 'ac', 'ca', 'bc', 'cb', 'abc', 'acb', 'bac', 'bca', 'cab', 'cba'

Комбинации 'abc': {}, {'a'}, {'b'}, {'c'}, {'a','b'}, {'b','c'}, {'a','c'}, {'a','b','c'}


В питоне

Используйте from itertools import * (поскольку функции действительно должны быть в пространстве имен по умолчанию) или import itertools, если хотите.

Если вы заботитесь о перестановках :

permutations(yourString, 8)

Если вы заботитесь о комбинациях :

combinations(yourString, 8)

На других языках

В других языках существуют простые рекурсивные или итеративные алгоритмы для их генерации. Смотрите википедию или stackoverflow. например http://en.wikipedia.org/wiki/Permutation#Systematic_generation_of_all_permutations


Важное примечание

Обратите внимание, что число перестановок N!, поэтому, например, ваша строка будет иметь

  • (69 choose 8) = 8 billion комбинаций длины 8 и, следовательно, ...
  • (69 choose 8) * 8! ~= 3.37 × 10^14 перестановок длины 8.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...