位计数从 0 ~ N 在 O(logn)
Bit Counting from 0 ~ N in O(logn)
本文关键字:logn 更新时间:2023-10-16
以下是我在采访街网站上看到的C++码,它从0~a(输入数字)计算1的位,我们可以说是1~a,因为0没有1。此代码的时间复杂度为 O(logn) 使用重复周期。
我只是不明白其中的逻辑。谁能解释为什么?感谢!
long long solve(int a)
{
if(a == 0) return 0 ;
if(a % 2 == 0) return solve(a - 1) + __builtin_popcount(a) ;
return ((long long)a + 1) / 2 + 2 * solve(a / 2) ;
}
顺便说一句,__builtin_popcount() 是 GNU 提供的用于计算 1 位的内置方法。
我将尝试
O(lg n)
复杂性。请注意,我不太明白该函数的作用,尽管证明仍应保留运行时间。
鉴于我们的递归关系:
T(a) = 0, if a == 0
| T(a - 1) + O(1), if a is divisible by 2
O(1) + T(a/2)
我将在这里使用迭代方法:
T(a) = T(a/2) + O(1)
T(a) = T(a/2^2)) + O(1) + O(1)
T(a) = T(a/2^k)) + (k-1)O(1)
// continue unrolling until we reach the base case
T(a) = 0 + O(1) + ... + O(1) + O(1) = kO(1)
// k here corresponds to lg a since we continued dividing the problem set in half
T(a) = (lg a)*O(1)
T(a) = lg a
质检部
相关文章:
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 在 O(logn) 时间内使用稀疏矩阵的 LCA
- 合并排序无法在N logN中工作
- 最近一对SPOJ logN时间回答错误
- 位计数从 0 ~ N 在 O(logn)
- 使用 STL 容器在 logN 中插入、查找最小(键)和删除(基于值)功能
- 用STL堆在O(logn)时间内实现Decrease Key
- 如何在O(logn)中找到stl集合中元素的秩
- 当我想根据两个键排序时,如何获得O(logn)
- 我们如何在O(logN)时间内实现第N个Fibonacci数的最后6位
- 从数据库中搜索时间复杂度为O(1)O(logn)的行
- Are std::find and std::map.find both O(logN)?