c - 如何并行计算 k 个集合位的所有组合?
问题描述
我想有效地计算一个 n 位数的所有组合(在我的例子中,n = 36),并且恰好设置了 k 位。
我在想像 Gosper's Hack 之类的东西,但可以并行化。
例如,如果我可以将一个索引传递给 Gosper's Hack,那将是完美的,它会计算第 i 个组合。
unsigned long long permute(unsigned long long val, unsigned long long i)
{
int ffs = __builtin_ffsll(val);
val |= (val - 1);
// Do something here with `i` to produce the i'th combination, rather than the next one.
return (val + 1) | (((~val & -(~val)) - 1) >> ffs);
}
此外,在我的情况下,组合不一定需要按字典顺序排列。只要生成所有组合,任何排序都可以。
解决方案
您可以按照以下示例实现它:
long to_combination(int k, int N) {
if (N == 0) {
return (1L<<k)-1;
}
int n;
for (n=k; C(n,k)<=N; n++)
;
n--;
return (1L<<n) | to_combination(k-1, N - C(n,k));
}
调用to_combination(5, 72)
返回 331(101001011
二进制,表示{8, 6, 3, 1, 0}
),如示例中所示。
推荐阅读
- reactjs - 如何在 Next js 项目中创建会话?
- symfony - 使用转发时,无法在 Symfony 控制器中访问 POST-Params?
- c# - 无论如何使用 ProducesResponseType 属性和招摇来表示 void 返回类型?
- javascript - 使用非 ISO 日期格式在 jquery datepicker 中获取日期
- python - Seaborn 自定义范围热图
- cakephp-4.x - 检查同一用户是否从其他设备(网络或移动设备)登录
- c# - MVC 和 SPA 应用程序之间基于 Identity Server 4 的共享身份验证
- sql-server - 带有特殊字符的 mssql 编码问题
- html - CSS嵌套树悬停
- javascript - 减少/消除两个表格单元格之间的间隙?在反应