Algorithm 找到一个数字在达到1之前可以被2除多少次的最有效算法[注:如果可能,在O(1)时间内]
我尝试使用log,但它比迭代版本要花费更多的时间来找到答案。 这个数字是整数Algorithm 找到一个数字在达到1之前可以被2除多少次的最有效算法[注:如果可能,在O(1)时间内],algorithm,numbers,Algorithm,Numbers,我尝试使用log,但它比迭代版本要花费更多的时间来找到答案。 这个数字是整数 Using log:- int ans = (log(x)/log(2)); Iterative version:- int temp; while(x) { temp = temp/2; count++; } count--; 基本整数数据类型 对于x86体系结构上的整数,有一条O(1)指令: 返回MSB集合位的位置的。因此,您不需要执行迭代的O(log(n))分割、移位或bin搜索。为确保
Using log:-
int ans = (log(x)/log(2));
Iterative version:-
int temp;
while(x)
{
temp = temp/2;
count++;
}
count--;
O(1)
指令:
O(log(n))
分割、移位或bin搜索。为确保符号(2'os补码)不会对负数造成混乱,请使用abs
值O(log(n))
。其中n
是您正在测试的数字O(1)
,因为您只需提取指数,它直接告诉您MSB集合位的位置
另外,对于大多数体系结构上的基本浮点数据类型,log2
由FPU HW直接实现,但它们不会返回整数样式的结果实际有效(见现有答案)或渐近有效(见其他现有答案)?您的数字大小和类型已知(32位/64位整数、32位浮点…)吗?我只能猜测它是一个整数,因为它在连续除以2时“达到1”。@Nelxiost float也达到零eventually@harold不过,他们不一定能达到一个目标。