Gosper's Hack 算法
2022/8/31 14:22:58
本文主要是介绍Gosper's Hack 算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
XIN 队算法之枚举组合 .
枚举组合的一个非递归做法叫 Gosper's Hack 算法,思路就是对每个组合,用 01 串表示其选或不选,这样必然可以表示所有组合 .
我们考虑如何生成一个组合的下一个组合,因为是组合,所以我们要保证串串的 popcount 不变,这样就考虑把最后一个 01 变成 10,这样显然是对的 .
而且要保证生成完的串串 \(b'\) 和原来的串串 \(b\) 的差值 \(b'-b\) 最小,这样我们才能保证生成所有组合,于是我们只需要把所有 1 集中到最右边即可 .
我们考虑如何用位运算描述这个过程,具体可以看下面的代码手玩一下 .
比如按字典序生成 \(n\) 元集合所有 \(k\) 元子集就可以写为
const int N = 1 << 25; int n, k, state[N], cc; int main() { scanf("%d%d", &n, &k); if (!k) return 0; int cur = (1 << k) - 1, limit = (1 << n); while (cur < limit) { state[++cc] = cur; int lb = cur & -cur, r = cur + lb; cur = ((r ^ cur) >> __builtin_ctz(lb) + 2) | r; // 如果不用 builtin 函数可以写 cur = (((r ^ cur) >> 2) / lb) | r; } for (int i=cc; i>=1; i--, puts("")) for (int j=n-1; j>=0; j--) if (state[i] >> j & 1) printf("%d ", n-j); return 0; }
时间复杂度为 \(\displaystyle O\left(\dbinom nk\cdot n\right)\),非常的高效,也非常的简洁 .
这篇关于Gosper's Hack 算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站