algorithm - 用 k 1s 获得所有二进制组合的高效算法
问题描述
我有n位,我知道其中k位是 1。
我应该从n = 4 和k = 2 的算法中得到的结果是:
1100
1010
1001
0110
0101
0011
我已经尝试了一些递归策略,但它们都不足以满足我的需求(n可能 > 50000)。
我也看过类似问题的答案,但效率不够。
我认为通过利用 1 和 0 没有区别这一事实,我可以让某些东西快速运行,这样我就可以避免很多会产生相同结果的迭代。
同样,我注意到我可以避免计算多达一半的结果,因为它们中的大多数只是彼此相反的二进制(即 1100 -> 0011)。
解决方案
在 C++ 中,您可以使用std::next_permutation
,但您应该找到 std::string 以外的其他内容作为您的类型。
#include <algorithm>
#include <string>
#include <iostream>
void Permute(int n = 8, int k = 3) {
std::string s = std::string(n-k, '0')+std::string(k, '1');
do {
std::cout << s << '\n';
} while(std::next_permutation(s.begin(), s.end()));
}
00000111
00001011
00001101
00001110
00010011
00010101
00010110
00011001
00011010
00011100
00100011
00100101
00100110
00101001
00101010
00101100
00110001
00110010
00110100
00111000
01000011
01000101
01000110
01001001
01001010
01001100
01010001
01010010
01010100
01011000
01100001
01100010
01100100
01101000
01110000
10000011
10000101
10000110
10001001
10001010
10001100
10010001
10010010
10010100
10011000
10100001
10100010
10100100
10101000
10110000
11000001
11000010
11000100
11001000
11010000
11100000
推荐阅读
- psse - 将 PSS/E .raw 文件转换为 Pandapower
- spring-mvc - Sonarcube:不应取消引用空指针
- forms - 当我重新加载列表视图项目时,“指定的演员表无效” - Xamarin Forms
- python - Flask 在尝试渲染模板时给出 404
- swift - 使用未包装的选项删除核心数据元素
- css - 展开子菜单时无法点击移动菜单
- kotlin - Kotlin val 和 var 在 onClickListener 之外不起作用
- android - Firebase RecylerView 分页适配器无法正确分页?
- javascript - 根据下拉值在引导日期选择器中动态开始/结束日期
- list - 在 Flutter 中使用 Dismissible 小部件时 ListTile 覆盖父容器