- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
以下是我在interview street网站上看到的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
Q.E.D.
关于c++ - 在 O(logn) 中从 0 ~ N 计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10522825/
对于那些非常了解这一点的人,只需阅读下面的粗体文本以了解实际问题。 辅助函数前言: 我知道合并两个相同等级的二项式树的复杂度为 O(1),因为所需要做的只是将 T1 的头部附加为另一个的 child
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
for(int i=1;i*i
有谁知道我可以在最坏情况下 O(logn) 访问和删除第 k 项的数据结构,并且还支持在最坏情况下 O(logn) 下在第 k 项之后插入一项的操作? 最佳答案 是的。您所描述的可以通过增强树来实现。
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
实现合并所需的操作数是: ::::::6n (logn+1)= 6nlogn+6n. logn+1 是归并排序的层数。这里的 6n 是什么? 最佳答案 在原始合并排序的情况下:两次读取比较两个元素,一
我的算法课有问题。问题状态: Assume you are given an array of n integers in the range{1,...,logn**logn}. Show how
是否有一种类似集合的数据结构支持O(logn)时间的合并和O(logn)时间的第k个元素搜索? n 是这个集合的大小。 最佳答案 你可以试试 Fibonacci heap它确实在恒定摊销时间内合并并在
log n^2 等同于 2logn,它以与 logn 相同的速率增长,因为我忽略了因子和常量。但是,如果我要对整个项进行平方,以便得到 (logn)^2,它是否也是 logn 的大 theta? 最佳
Java TreeSet 类可以维持 add 方法的 O(logN) 成本。如果数据按排序顺序输入,这是如何工作的? 既然二叉搜索树的 add 方法在给定排序数据时会退化为 O(N),为什么 Tree
我有一个家庭作业问题如下(请注意,我不是在寻找确切的答案,只是在寻找简单的建议以继续前进)。 S is a data structure which supports Insert(x,S), Del
我正在使用一个优先级队列,该队列最初将其元素的优先级基于启发式方法。随着元素出队,启发式更新,并且当前队列中的元素的键可能会增加。 我知道有一些已摊销O(1)减少键操作的堆(特别是斐波那契堆),但是是
这个问题已经有答案了: Binary Search O(log n) algorithm to find duplicate in sequential list? (3 个回答) 已关闭 6 年前。
#include int powFast(int b, int e){ if(e==1){ return b; } else if(e%2 ==0){
这可能吗?我想到了这个: void binary_search(int list[], int lo, int hi, int key, int* maxIndex, int* minIndex) {
我已经为一个挑战编写了以下解决方案,但我不确定它的时间复杂度: def ASCIIConversion(string): newStr = '' for chr in string:
以下是一段 python 代码,用于使用 Goodrich 和 Tamassia 一书中的二进制递归查找元素列表的总和。 def binary_sum(S, start, stop): "
我想计算字典中给定值的项目数(假设字典中的值只是数字),我在网上搜索并找到了两种方法,first one : sum(x == chosen_value for x in d.values()) 第二
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 4 年前。 Improve t
我的问题 (您可以跳过此部分并转到下一部分以了解实际问题。这只是为那些真正想知道“您到底为什么要问这个?”的人提供的背景信息) 想象一个物体从无摩擦的山坡上滑下。有加速度为 0 的平坦区域。其余路径的
我是一名优秀的程序员,十分优秀!