我一直在阅读第四版算法,它定义的问题如下:
编写一个静态方法
lg()
,该方法采用一个int
值N
作为参数,并返回最大的int
,该值不大于{{1 }}。不要使用数学。
我发现了以下解决方案:
N
我想知道为什么该解决方案有效。为什么连续除以2可以让我们找到小于参数的以2为底的对数的最大整数?我确实了解Java,但不了解这种特定算法的工作原理。
谢谢。
答案 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开始。