我想使用std::bitset
在C ++中实现binary counter。如果我明确地为bitset
开发了一个加法函数,那么算法的复杂性将达到O(n ^ 2)。有没有办法做到这一点O(n)?
对Horowitz和Sahni的子集和问题解决方案有什么好的描述吗?除了维基百科,我找不到任何描述他们算法的好消息来源。
答案 0 :(得分:1)
对于你的第二个问题,“对Horowitz和Sahni的子集和问题解决方案有什么好的描述吗?”,我发现很少的文章:
Horowitz和Sahni的原始论文:
http://www.cise.ufl.edu/~sahni/papers/computingPartitions.pdf
关于Horowitz和Sahni算法改进的Stackoverflow讨论:
Generate all subset sums within a range faster than O((k+N) * 2^(N/2))?
源代码:
http://www.diku.dk/hjemmesider/ansatte/pisinger/subsum.c
答案 1 :(得分:1)
如果bitset足够小,所有位都可以放在unsigned long
中,那么你可以使用它的转换函数对它进行整数运算,例如
bitset = std::bitset(bitset.to_ulong() + 1);
在C ++ 11中,还有一个to_ullong()
函数,提供unsigned long long
,可能大于unsigned long
。
如果您的位集太大,那么您可能最好根据计数器可以访问的数组或整数向量来实现自己的位集。你的算法仍然是O(n 2 ),但与一次处理一个比特相比,你可以减少每次加法所需的操作次数。