计算小于N的以2为底的对数的最大int

时间:2018-12-29 18:22:08

标签: java algorithm math logarithm

我一直在阅读第四版算法,它定义的问题如下:

  

编写一个静态方法lg(),该方法采用一个intN作为参数,并返回最大的int,该值不大于{{1 }}。不要使用数学。

我发现了以下解决方案:

N

我想知道为什么该解决方案有效。为什么连续除以2可以让我们找到小于参数的以2为底的对数的最大整数?我确实了解Java,但不了解这种特定算法的工作原理。

谢谢。

4 个答案:

答案 0 :(得分:3)

这与指数和对数的性质有关。您需要的主要观察结果是

  

2 lg n = n,

因为对数是指数的倒数。重新排列该表达式会得到

  

1 = n / 2 lg n

换句话说,lg n的值是必须将n除以2才能将其降至1的次数。顺便说一句,这是在研究算法时真正具有的直觉,因为日志字词会一直在此类情况下显示。

关于整数除法的工作原理,这里还有其他一些细微差别,但这是代码为何起作用的基本思想。

答案 1 :(得分:2)

它从对数标识this.service.getSomething().subscribe((model: myModel) => model);来看很简单。

您要搜索最大的整数log(a/b) = log(a) - log(b),以便:

x

使用上面的身份并考虑到x <= log2(n) 我们得到的信息:

log2(2) = 1

因此x <= log2(n/2) + log2(2) x <= log2(n/2) + 1 x <= log2(n/4) + 2 x <= log2(n/8) + 3 ... x <= log2(1) + k x <= k (since log2(1) = 0) 是您在达到x之前用n除以2的次数。

答案 2 :(得分:0)

答案纯粹是数学,

  

log 2(n)= ln(n)/ ln(2)= x

通过应用指数规则:

  

ln(n)= ln(2)*(x)

     

n = 2 ^ x

因此,您必须除以2,直到该值小于1,才能获得与其最接近的整数。

答案 3 :(得分:0)

我们正在寻找最大的整数x,以使x <= log_2(N),即2 ^ x <= N

或等效的2 ^ x <= N <2 ^ {x + 1}

让N_0 = N

并且对于k> 0,N_k是N_ {k-1}除以2和r_k除以{0,1}的余数(N_ {k-1} = 2.N_k + r_k)的商。

我们有:

2 ^ {x-1} <= N_1 +(r_1 / 2)<2 ^ x

但是0 <= r_1 / 2 <= 1/2,其他数字是整数,所以等价于

2 ^ {x-1} <= N_1 <2 ^ x

我们先后有:

2 ^ {x-1} <= N_1 <2 ^ x

2 ^ {x-2} <= N_2 <2 ^ {x-1}

...

2 ^ {x-x} <= N_x <2 ^ {x-x + 1}

最后一个也写为1 <= N_x <2

但是N_x是整数,所以N_x = 1

因此,x是N的大于等于2的2除数。

我们可以从N_0 = N开始并保持大于1,而不是从N_1开始。