n 中 k 个元素的所有组合
有人可以给我提供一个函数的链接或伪代码,用于查找 n 中 k 元素的所有组合吗?可能是STL。我不需要计算 n 选择 k,我需要列出大小为 k 的所有向量。
谢谢
Can somebody provide me a link or pseudocode of a function for finding all combinations of k elements out of n? possibly in STL. I don't need to compute n choose k, I need to list all vectors of numbers of size k.
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
在 C++ 中,给出以下例程:
然后您可以继续执行以下操作:
或者对于 int 的 std::vector:
In C++ given the following routine:
You can then proceed to do the following:
Or for a std::vector of int's:
http://howardhinnant.github.io/combinations.html
搜索“for_each_combination”。如果您找到更快的东西,请告诉我。与我经常看到的其他算法不同,该算法不要求元素类型为 LessThanComparable。
http://howardhinnant.github.io/combinations.html
Search for "for_each_combination". If you find something faster, please let me know. Unlike other algorithms I often see, this one doesn't require the element type to be LessThanComparable.
创建一个辅助向量,其中包含 n - k 个零,后跟 k 个 1。零表示不包含原始容器中的元素,而一表示包含该元素。
现在在辅助向量上使用 std::next_permutation 来获取下一个组合。
Create an auxiliary vector with n - k zeros followed by k ones. A zero means the element in the original container is not included, whereas one means the element is included.
Now use std::next_permutation on the auxiliary vector to get the next combination.
这是一个可以完成工作的伪代码的懒惰示例......
Here is a lazy example of pseudocode that can get the job done...
您可以使用 std::next_permutation 但它是 n!而不是n选择k。您可以在创建它们后对其进行过滤。但这个解决方案的复杂度是 O(n!),并不是很完美。这是反复试验的解决方案:
You could use std::next_permutation but it is n! and not n choose k. You could filter them after you created them. But this solution is O(n!), not really perfect. Here is the trial and error solution: