Показать сообщение отдельно
Старый 19.09.2008, 11:43   #69  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от avf Посмотреть сообщение
перестановки: Всё гениальное - простынь)
Произвольную перестановку можно представить в виде суперпозиции транспозиций соседних элементов. [[Липский] Комбинаторика_для программистов.] Т.е. достаточно n! раз последовательно попарно переставить соседние элементы:
Хм... Не плохой вариант, основной недостаток - алгоритм не работает для n>3 .

Цитата:
Сообщение от dn Посмотреть сообщение
Ещё один вариант...
X++:
BMRandom    bmrandom = new bmRandom();
    container   a = ['a','b','c','d'];
    container   b;
    .......
    while (result.elements() < N);
Ура! Это решение вроде как работает для всех n!
Единственный серьезный минус - количество проходов цикла. В лучшем случае цикл делает в 2 раза больше проходов, чем нужно для поиска всех перестановок. У меня этот алгоритм выдал следующие результаты:
  • Для n = 3 количество решений 6, количество проходов цикла 12
  • Для n = 5 количество решений 120, а количество проходов цикла уже 696

И еще желательно в решении не используются нестандартные типы данных: контейнер, множество. Лучше все-таки обойтись стандартными типами данных - целые и вещественные числа, строки, а так же их массивы.
Небольшая оптимизация цикла и используемых типов данных - и решение получится идеальным .