c++ - 实现 count_permutations 的更好方法?

标签 c++ algorithm math

我需要一个函数 count_permutations() 来返回给定范围的排列数。 假设允许修改范围,并从第一个排列开始,我可以天真地将其实现为重复调用 next_permutation(),如下所示:

template<class Ret, class Iter>
Ret count_permutations(Iter first, Iter last)
{
    Ret ret = 0;
    do {
        ++ret;
    } while (next_permutation(first, last));
    return ret;
}

有没有不需要遍历所有排列来找到答案的更快方法?它仍然可以假设输入可以被修改,并从第一个排列开始,但显然如果没有这些假设也可以实现,那也很棒。

最佳答案

所有元素都唯一的范围的排列数是 n!其中 n 是范围的长度。

如果有重复元素,可以使用 n!/(n_0!)...(n_m!) 其中 n_0...n_m 是重复范围的长度。

例如 [1,2,3] 有 3! = 6 个排列,而 [1,2,2] 有 3!/2! = 3 个排列。

编辑: 一个更好的例子是 [1,2,2,3,3,3],它有 6!/2!3! = 60 个排列。

关于c++ - 实现 count_permutations 的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/276066/

相关文章:

c++ - C++ 中的工厂模式和类模板

算法题: Converting non-integer maximum flow to integer maximum flow

python - 如何比较两个列表并找出 `added` `deleted` `unchanged ` 部分

ios - 如何根据 UIButton 的 y 位置获取未知的浮点值

c++ - 长宽比 - 如何处理它们? (D3D 视口(viewport)设置)

c++ - Git Diff Indent/Pretty Print/Beautify Before Diff

c++ - 为什么缓冲区应该在 64 字节边界上对齐以获得最佳性能?

python - 安装用 C++ : g++ unrecognized command line option --output-lib 编写的 Python 包 (leven) 时出错

python - 在python中使用未指定的加密 key 解码加密文本

c++ - 完美的正方形和完美的立方体