- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我的组合数学组合函数。
例如:组合 "ABCD", 2 = AB AC AD BC BD CD。
以后,我会对每个组合做一些操作(不仅仅是printf
)。
我想知道,有没有办法提高这段代码的性能?
#include "stdafx.h"
#include "iostream"
#include <vector>
void display(std::vector<char> v, int* indices, int r)//f() to display combinations
{
for (int i = 0; i < r; ++i)
std::cout << v[indices[i]];
std::cout << std::endl;
}
void combinations(std::vector<char> v, int n, int r, void(*f)(std::vector<char>, int*, int))
{
int* indices = new int[r];
for (int i = 0; i < r; ++i)
indices[i] = i;
int count;
bool b;
f(v, indices, r);
while (true)
{
b = true;
for (count = r - 1; count >= 0; --count)
{
if (indices[count] != count + n - r)
{
b = false;
break;
}
}
if (b)
break;
++indices[count];
for (int i = count + 1; i < r; ++i)
indices[i] = indices[i - 1] + 1;
f(v, indices, r);
}
delete[] indices;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<char> v(4);//pool
v[0] = 'A';
v[1] = 'B';
v[2] = 'C';
v[3] = 'D';
int n = 4;// pool size
int r = 2;// length of each combination
combinations(v, n, r, display);// pool, pool size, len of combination, func for each combination
return 0;
}
最佳答案
也许不是性能但可读性也很重要。请参阅递归解决方案。 http://cpp.sh/2jimb
#include <iostream>
#include <string>
typedef unsigned int uint;
typedef std::string::iterator seq_iterator;
std::string FindCombinations(seq_iterator current, seq_iterator end, uint comb_length, std::string comb)
{
if (comb_length == 0 || comb_length > std::distance(current, end))
return comb;//no more possible combinations
auto next = current + 1;
std::string with;
if (std::distance(next, end) >= comb_length - 1)
with = FindCombinations(next, end, comb_length - 1, comb + *current);//use current in combination
std::string without;
if (std::distance(next, end) >= comb_length)
without = FindCombinations(next, end, comb_length, comb);//skip current in combination
std::string result = with;
if (!result.empty() && !without.empty())
result += ' ';
return result + without;
}
int main()
{
std::string seq = "ABCDE";
std::cout << FindCombinations(seq.begin(), seq.end(), 2, "") << std::endl;
}
关于C++ Combinatorics 组合高性能函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37269032/
我有一些容量不同的垃圾箱和一些指定大小的物体。目标是将这些元素打包到垃圾箱中。到目前为止,它类似于装箱问题。但不同之处在于每个对象都与另一个对象有部分重叠。因此,虽然对象 1 和 2 的大小为 s1
我需要找到彩票组合的等级/索引并能够逆向过程(根据等级找到彩票组合)。 考虑一个彩票游戏,5 个球从 1 到 45,1 个强力球从 1 到 20。不允许重复,顺序无关紧要。组合数为: (45 * 44
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
这是我的组合数学组合函数。 例如:组合 "ABCD", 2 = AB AC AD BC BD CD。 以后,我会对每个组合做一些操作(不仅仅是printf)。 我想知道,有没有办法提高这段代码的性能?
我们都知道移动设备上的新密码屏幕。它由要连接的点矩阵组成。 唯一密码是积分的向量。这些点可以通过以下限制与自己连接: 一个点只能连接到另外一个点 如果目标点和自由点在同一条线上,则将强制一条线连接到更
我有一个人员列表,我想将他们全部配对,然后根据偏好进行一些过滤。当我生成候选解决方案时,如何避免创建重新配对人员的候选解决方案。 例如: person(a;b;c;d) . {match(X, Y):
我有一个人员列表,我想将他们全部配对,然后根据偏好进行一些过滤。当我生成候选解决方案时,如何避免创建重新配对人员的候选解决方案。 例如: person(a;b;c;d) . {match(X, Y):
给定一个向量 v = [1,..,n] ,我尝试在 julia 中计算所有具有替换的 n 个元素的唯一集合。 由于我想对较大的 n 值执行此操作,因此我正在寻找一种有效的解决方案,可能使用迭代器。 例
有一张 table ,上面有四枚初始面随机的硬币。你被蒙上眼睛,每一轮,你都必须选择一部分硬币来翻转。你的目标是让他们都面对同样的方式。 还有其他人,在您掷硬币后,会在轮到他们时随意旋转 table
给定一个集合 S与 n元素和一个整数 k .我需要找到所有 n 的乘积总和选择 k对。也就是说,如果 S = {1,2,3,4} and k = 2 ,那我要找P = 1*2 + 1*3 + 1*4
我在 lintcode 上遇到了这个问题,我已经阅读了两个过去的解决方案,但它们对我来说都没有意义。 问题如下: There is a fence with n posts, each post ca
我需要 C++ 代码来生成所有可能的组合 (n,k) 与 repitions其中 n - 输入数组中的整数个数。 k - 位置数 例如输入: n = [1 2 3]; k = 2; 输出: A3 =
math.combinatorics 的文档声明所有函数都返回惰性序列。 但是,如果我尝试运行 subsets有大量数据, (last (combinatorics/subsets (range 20
假设一个游戏掷出 20 个 8 面骰子,总共有 8^20 种可能的结果。为了计算特定事件发生的概率,我们将事件发生的方式数除以 8^20。 可以计算得到值 3 的 5 个骰子的方法数。(20 选择 5
我正在尝试使用 Math::Combinatorics 生成数组的唯一排列。如CPAN page说可以使用 next_string() 来完成: use Math::Combinatorics; my
我是一名优秀的程序员,十分优秀!