Мне нужна функция count_permutations(), которая возвращает количество перестановок заданного диапазона. Предполагая, что диапазон позволено быть изменен, и начинается с первой перестановки, я мог бы наивно это реализовать в виде повторных обращений к next_permutation(), как показано ниже:Лучший способ реализовать count_permutations?
template<class Ret, class Iter>
Ret count_permutations(Iter first, Iter last)
{
Ret ret = 0;
do {
++ret;
} while (next_permutation(first, last));
return ret;
}
Есть ли более быстрый способ, который Безразлично» t требует итерации через все перестановки, чтобы найти ответ? Он все же может предположить, что вход может быть изменен и начинается с первой перестановки, но, очевидно, если это возможно реализовать без этих предположений, было бы здорово.
Хорошо, поэтому, если диапазон отсортирован, потребуется один проход через диапазон, чтобы найти все размеры дубликатов диапазонов. Благодарю. – 2008-11-09 16:38:58
Для C++ да, было бы проще, если диапазон отсортирован. Для динамически типизированного языка, такого как Python, можно сделать даже несортированный список. Даже если вам нужно отсортировать диапазон, временной сложностью будет O (n log n + n) = O (n log n), не принимая во внимание факторный расчет. – 2008-11-09 16:46:56