专栏文章
基于位运算的 O(loglogn) popcount 算法详解
算法·理论参与者 3已保存评论 4
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mioxoknj
- 此快照首次捕获于
- 2025/12/03 02:50 3 个月前
- 此快照最后确认于
- 2025/12/03 02:50 3 个月前
更快的
P1 算法
考虑 做法,以 为例:
注意到, 可作如下转化:
注意到,每次右移运算都要重复 次,有 次右移运算,时间复杂度 考虑优化重复计算:
统一进行x >> (i & 1):x = (x & 0b0101010101010101) + ((x & 0b1010101010101010) >> 1)统一进行x >> (i & 2):x = (x & 0b0011001100110011) + ((x & 0b1100110011001100) >> 2)统一进行x >> (i & 4):x = (x & 0b0000111100001111) + ((x & 0b1111000011110000) >> 4)统一进行x >> (i & 8):x = (x & 0b0000000011111111) + ((x & 0b1111111100000000) >> 8)
注:在这样的计算顺序下,进位不会影响正确性,但其他(大部分)顺序都会影响,原理可尝试自行分析,测试代码与神秘性质。
在实现时,需注意像是
x = (x & 0b0000000011111111) + ((x >> 8) & 0b0000000011111111) 与 x = (x & 0b0000000011111111) + ((x & 0b1111111100000000) >> 8) 两种写法虽理论效果相同,但实际效果会有不同,一般情况后一种写法会发挥预期效果。 长度不同时,做法是类似的。
时间复杂度:,空间复杂度:。
P2 分析
注意到,在 时,
1,2,4,8 和 1,2,8,4 两种操作顺序都是正确的。类似的,在 时,1,2,4,8,16,1,2,4,16,8,1,2,8,4,16 和 1,2,16,4,8 四种操作顺序都是正确的。其原因尚不明确。下面给出顺序操作的正确性证明:
以 为例:
在进行运算前,可视为 分别存储了对应部分数字的 ,因为 。
第 次运算后,可视为 分别存储了对应部分数字的 ,因为 所占位数不长于 所占位数。
第 次运算后,可视为 分别存储了对应部分数字的 ,与上步分析同理。
第 次运算后,可视为 分别存储了对应部分数字的 ,与上步分析同理。
第 次运算后, 存储了 的 ,计算完成。
相关推荐
评论
共 4 条评论,欢迎与作者交流。
正在加载评论...