2015-07-03 3 views
1

алгоритма, который я знаю, что это ниже, но почему я ненавижу этот подход является его сложность время O ((п + 1)!) Тоже хуже в случае больших строкЧто такое алгоритм для печати перестановок строки с большой эффективностью?

Start сортировки строки и печатать это как первую перестановку.
Теперь мы можем найти следующую перестановку следующим образом:

Пусть я в последний индекс, что вход [я] < вход [я + 1]. Если такого индекса нет, тогда все готово. Пусть j - последний индекс, такой как вход [i] < вход [j]. Вход обмена [i] с входом [j]. Обратный вход [i + 1] через вход [input.length - 1].

Есть ли лучший подход, чем один из приведенных выше? (Если объяснение через код, пожалуйста, рассмотреть С или С ++) ... просто я ожидал лучшего алгоритма с меньшей временной сложностью, чем один из приведенных выше

+1

см. Это http://stackoverflow.com/questions/361/generate-list-of-all-possible-permutations-of-a-string –

ответ

6

Есть n! перестановки для строки длиной n. Просто распечатать их - O(n * n!), как вы можете ожидать, что это будет намного эффективнее?

+0

Если нет повторяющихся букв, то существует меньше, чем 'n!' перестановки. – Lundin

+0

ya, я знаю это, но у меня была надежда, может быть, есть какие-то шансы на то, чтобы стать намного лучше. –

+0

Это на самом деле O (n * n!), Так как каждая печать сама является O (n) – amit

0

Имейте в виду, что в C++ STL имеет зЬй :: next_permutation, что делает работу вам нужно

3

Даже стандартный C++ реализации для печати перестановкам строки следует точно такой же алгоритм (std::next_permutation и std::prev_permutation)

std::string s; 
std::sort(s.begin(), s.end()); 
do { 
    std::cout << s << std::endl; 
} while(std::next_permutation(s.begin(), s.end())); 
Смежные вопросы