`
ihuashao
  • 浏览: 4856641 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

用next_permutation()生成r-组合数,兼发现VC7的一个bug

J# 
阅读更多

C++ standard library提供了两个生成排列的algorithms:next_permutation()与prev_permutation(),却没有提供生成组合数的标准函数。

由于排列与组合之间有着密切的联系,我们很容易就可以从“排列”获得“组合”。从n个元素中任取r个元素的组合,有n! / (r! * (n-r)!)个。这些组合可用多重集{r·1, (n-r)·0}的全排列来生成,请看示例程序:

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main()
{

// 从n个元素中,任取r个元素的所有组合:
// G++[o] BCC5[o] VC7[x]

const int n = 7;
const int r = 4; // 0 <= r <= n
vector<int> p, set;
p.insert(p.end(), r, 1);
p.insert(p.end(), n - r, 0);

for ( int i = 0; i != p.size(); ++i )
set.push_back(i+1);

int count = 0;
do {
for ( int i = 0; i != p.size(); ++i )
if(p[i])
cout << set[i] << " ";
count++;
cout << "\n";
} while (prev_permutation( p.begin(), p.end() ));

cout << "There are " << count << " combinations in total.";
}

以上程序在G++ 3.2、BCC 5.5.1、VC7下编译通过,但在VC7版运行发生死循环。怀疑这是VC7的bug, 于是再用以下程序验证之:

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>

using namespace std;

int main()
{
// 经VC7编译执行后,会死循环,不可思议!
// BCC5[o] G++[o] VC7[x]
vector<int> p;

p.push_back(2);
p.push_back(2);
p.push_back(1);

do {
copy(p.begin(), p.end(), ostream_iterator<int>(cout, " "));
cout << "\n";
} while (prev_permutation(p.begin(), p.end()));
}

依旧是VC7版发生死循环,看来这真的是vc7中prev_permutation()的一个bug。我向http://www.dinkumware.com/提交了一份bug report,得到的回复是:

Our documentation points out, for both prev_permutation and
next_permutation that no two elements may have equivalent
ordering.

P.J. Plauger

经查,http://www.dinkumware.com/的文档中确实有这样的说法。而在MSDN中,我没有找到类似的提法,恐怕只能解释为MS的文档的更新太慢了。

分享到:
评论

相关推荐

    Perm_char.zip_The Next_permutation

    标题"Perm_char.zip_The Next_permutation"暗示了我们讨论的主题是关于C++中的下一个字典序排列。这个功能可以帮助我们在已排序的字符序列中找到下一个按字典顺序排列的序列。在C++标准库中,`std::next_permutation...

    C++ STL库函数next-permutation和prev-permutation用法解析

    内容概要:本文深入讲解了C++标准模板库(STL)中两个用于排列组合的函数——next_permutation和prev_permutation的具体应用方法。文中展示了如何使用这两个函数来对向量(vector)进行全排列操作。首先介绍了next_...

    2017年计算机等级考试二级C++辅导:全罗列生成算法:next_permutation .docx

    next_permutation函数是C++/STL中定义的一个高效的算法,用于生成指定序列的下一个较大的排列。该函数广泛应用于各种排列生成算法中。 next_permutation函数的内部算法可以分为以下几步: 1. 首先,定义序列大小的...

    排列_next_permutation1

    next_permutation 函数是 C++/STL 中定义的函数之一,它可以生成给定序列的下一个较大的排列。prev_permutation 函数则是生成给定序列的上一个较小的排列。二者的原理相同,仅遍例顺序相反。 为了生成下一个较大的...

    next_permutation和prev_permutation两个STL自带排列函数

    函数是返回当前排列的下一个排列,如果没有,返回false 这两种方法都用永久性的改变了容器中元素的位置 排列的对象可以是任意的,基本数据类型、字符串、结构体等 一:next_permutation(start,end,//cmp) 使用默认...

    详谈全排列next_permutation() 函数的用法(推荐)

    这是一个c++函数,包含在头文件里面,下面是基本格式。 1 int a[]; 2 do{ 3 4 }while(next_permutation(a,a+n)); 下面的代码可产生1~n的全排列 #include #include using namespace std; int main(){ int n; ...

    next_permutation.cpp

    全排列.

    permutation entropy.rar_permutation_permutation entropy_permutat

    排列熵(Permutation Entropy)是一种衡量时间序列复杂性的统计方法,由Claude Marcus和Stefan Klus在2002年提出。它通过分析序列中子序列的相对顺序来评估序列的混沌程度和复杂性,对于非线性系统的分析具有较高的...

    PyPI 官网下载 | permutation_test-0.1.tar.gz

    "permutation_test-0.1.tar.gz"是PyPI上一个名为"permutation_test"的软件包的版本0.1的压缩文件,通常包含源代码和其他相关资源。 该压缩文件的格式是".tar.gz",这是一种常见的文件打包和压缩方式。".tar"是一个...

    js-leetcode题解之31-next-permutation.js

    3. next_permutation 算法理解:next_permutation是一种在已排序的序列中寻找下一个较大或较小的排列的算法。这个算法通常涉及两个步骤:首先从后向前查找第一个顺序对(i, i+1),使得A[i] [i+1];然后,再从后向前...

    DFS搜索 全排列 next_permutation.cpp

    DFS搜索案例——寻找全排列。 深度优先遍历图的方法是,从图中某顶点v出发: ...(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

    permutation_test_PLV_permutationtest_

    由于Permutation test检验计算量大而限制了其应用和推广,以致不为人熟知。现在由于计算机技术飞速发展,Permutation test又重新进入我们的视野。Permutation test有独特的优势,其对原始数据分布没有要求,特别适用...

    slmap_ccdf.rar_ccdf_matlab permutation_permutation

    combination & permutation

    zhihuan.rar_Visual_permutation_permutation cipher_transposition

    置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息...它的加密方法是将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,形成密文。

    c语言-leetcode题解之0567-permutation-in-string

    c语言入门 c语言_leetcode题解之0567_permutation_in_string

    permutation.docx

    给定标题“permutation.docx”和描述,我们将探讨如何使用R语言编程实现自动生成n个不同元素中取r个元素的所有排列。 `Permutation`函数是一个递归函数,它接受两个参数:n(元素总数)和r(要选择的元素数量)。...

    31.Next Permutation 下一个排列【LeetCode单题讲解系列】

    31.Next_Permutation_下一个排列【LeetCode单题讲解系列】

    PermutationAndCombination(JAVA).rar_java permutation_java 算法_per

    - `nextPermutation`/`nextCombination`:在现有排列或组合基础上生成下一个排列或组合,用于迭代实现。 `www.pudn.com.txt` 文件可能是下载来源的记录或者包含了一些关于算法的附加说明,具体内容需要查看才能确定...

    pailiezuhe.rar_pailiezuhe_permutation_字典法

    在实现过程中,通常会用一个递归函数,每次选择当前未使用的最小元素,并尝试将其放在排列的不同位置,直到所有元素都被使用过。 组合算法则涉及到从n个不同元素中不重复地选取m个元素的问题。与排列不同,组合不...

Global site tag (gtag.js) - Google Analytics