有人能为我提供一个函数的链接或伪代码,用于查找n中k个元素的所有组合吗?可能在STL.我不需要计算n选择k,我需要列出所有大小为k的数字向量.
谢谢
我想测试一个带有一组边缘情况和正常值的元组的函数.例如,在测试一个函数,该函数true在给定三个形成有效三角形的长度时返回,我将具有特定情况,负数/小数/大数,接近溢出的值等等; 更重要的是,主要目的是生成这些值的组合,有或没有重复,以获得一组测试数据.
(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...
Run Code Online (Sandbox Code Playgroud)
作为一个注释:我实际上知道答案,但它可能对其他人有帮助,对这里的人们来说是一个挑战! - 稍后会发布我的回答.
出于特殊的原因,我决定寻找一种算法,该算法产生1 ... n之间k个整数的所有可能选择,其中k整数中的顺序无关紧要(n选择k thingy).
从完全相同的原因,这是没有理由的,我也用C#实现了它.我的问题是:
你在我的算法或代码中看到任何错误吗?而且,更重要的是,你能建议一个更好的算法吗?
请注意算法而不是代码本身.这不是我写过的最漂亮的代码,虽然可以告诉你是否看到了错误.
编辑: Alogirthm解释 -
码:
public class AllPossibleCombination
{
int n, k;
int[] indices;
List<int[]> combinations = null;
public AllPossibleCombination(int n_, int k_)
{
if (n_ <= 0)
{
throw new ArgumentException("n_ must be in N+");
}
if (k_ <= 0)
{
throw new ArgumentException("k_ must be in N+");
}
if (k_ …Run Code Online (Sandbox Code Playgroud) 这是我的代码,以获得所有可能性:
$seq[1] = 'd';
$seq[2] = 'f';
$seq[3] = 'w';
$seq[4] = 's';
for($i = 1; $i < 5; $i++)
{
$s['length_1'][] = $seq[$i];
$c1++;
for($i2 = $i+1; $i2 < 5; $i2++)
{
$s['length_2'][] = $seq[$i].$seq[$i2];
$last = $seq[$i].$seq[$i2];
$c2++;
for($i3 = $i2+1; $i3 < 5; $i3++)
{
$s['length_3'][] = $last.$seq[$i3];
$last = $last.$seq[$i3];
$c3++;
for($i4 = $i3+1; $i4 < 5; $i4++)
{
$s['length_4'][] = $last.$seq[$i4];
$c4++;
}
}
}
}
for($i = 0; $i < $c1; $i++)
echo $s['length_1'][$i].'<br>'; …Run Code Online (Sandbox Code Playgroud) 我想从一组中生成大小为k的所有子集.
例如:-say我有一组6个元素,我必须列出元素基数为3的所有子集.
我试图寻找解决方案,但那些是代码片段.它已经很久了,我已经完成了编码,因此我发现很难理解代码并构建一个可执行程序.
C或C++中的完整可执行程序将非常有用.希望使用递归的最佳解决方案.
这是问题所在:
您有N(N代表您拥有的数字)数字.将它们分成两组,使得组中数字之和的差异最小.
例子:
5 // N
1, 9, 5, 3, 8 // The numbers
Run Code Online (Sandbox Code Playgroud)
如果我们在A组中放置1,9和3,在B组中放置5和8,则差异为0.
我想首先我应该计算所有数字的总和并除以2.然后检查可能的数字组合,其总和不高于所有数字总和的一半.在我这样做之后,我将选择最大的数字并打印出组.
我遇到了所有组合的问题,特别是当N是大数字时.我怎样才能完成所有组合?
另外我认为有点不同,我会按降序对数字进行分组,我会将最大数字放在A组中,最小数字放在B组中.然后我会反过来.这适用于某些数字,但有时它不会显示最佳分组.例如:
如果我使用前面的例子.按降序排列数字.
9, 8, 5, 3, 1.
Run Code Online (Sandbox Code Playgroud)
A组最大,B组最低.
Group A: 9
Group B: 1
Run Code Online (Sandbox Code Playgroud)
其他方式.
Group A: 9, 3
Group B: 1, 8
Run Code Online (Sandbox Code Playgroud)
等等.如果最后我只有一个数字,我会把它放在总和较低的组中.所以我终于得到:
Group A: 9, 3
Group B: 1, 8, 5
Run Code Online (Sandbox Code Playgroud)
这不是最佳分组,因为差异是2,但是如我所示,以不同的方式分组,差异可以是0.
我怎样才能获得最佳分组?
码:
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int convertToBinary(int number) {
int remainder;
int binNumber = 0;
int i = 1;
while(number!=0)
{
remainder=number%2;
binNumber=binNumber …Run Code Online (Sandbox Code Playgroud) 我整天都在看PHP数组排列/组合问题..但仍然无法弄明白:/
如果我有一个像这样的数组:
20 //key being 0
20 //key being 1
22 //key being 2
24 //key being 3
Run Code Online (Sandbox Code Playgroud)
我需要组合如:
20, 20, 22 //keys being 0 1 2
20, 20, 24 //keys being 0 1 3
20, 22, 24 //keys being 0 2 3
20, 22, 24 //keys being 1 2 3
Run Code Online (Sandbox Code Playgroud)
我目前的代码给了我:
20, 22, 24
Run Code Online (Sandbox Code Playgroud)
因为它不想重复20 ...但这就是我需要的!
这是我的代码.它直接来自Php递归以获得字符串的所有可能性
function getCombinations($base,$n){
$baselen = count($base);
if($baselen == 0){
return;
}
if($n == 1){
$return = array();
foreach($base as $b){
$return[] = …Run Code Online (Sandbox Code Playgroud) 我想函数生成来自n个元素的List的所有元素的k组合.请注意,我正在寻找组合,而不是排列,并且我们需要一个改变k的解决方案(即,对循环进行硬编码是禁止的).
我正在寻找一个优雅的解决方案,b)可以用VB10/.Net 4.0编码.
这意味着a)需要LINQ的解决方案是可以的,b)使用C#"yield"命令的解决方案不是.
组合的顺序并不重要(例如,词典编纂,格雷码,什么是你),如果两者发生冲突,优雅优于表现.
(OCaml的和C#解决方案,这里将是完美的,如果他们能在VB10进行编码.)
我正在努力有效地列出1到100之间的数字.但是我必须摆脱相同数字的数字.
例:
12根据这个规则是相同的21 13是31 14是41所以for循环它不会翻过相同的数字.
我正在考虑一些技巧,例如从1到100获取所有数字,然后删除当前数字的找到的排列.我问这个的原因是因为像100000这样的大范围会失败.
另一个例子: 124等于142,241,214,412,421
我知道我可以std::next_permutation在一些包含元素的容器上使用,这些元素[1, 2, 3]会产生这个序列的6个排列.我想要做的是给出一些集合[1, 2, 3, 4, 5, 6]生成大小为3的所有可能的排列.因此对于这个例子,[4, 3, 2]将是由此标准产生的排列之一.我正在寻找一种STL方式(如果可能的话),而不是编写我自己的组合功能.我应该阅读的任何特定的STL实现?
algorithm ×7
c++ ×5
combinations ×4
math ×2
permutation ×2
php ×2
recursion ×2
stl ×2
c ×1
c# ×1
linq ×1
numbers ×1
performance ×1
testing ×1
unit-testing ×1
vb.net ×1