我经常听说离散对数问题很难。然而,我不太明白为什么会这样。在我的看法中,一个普通的二分查找就可以很好地解决这个问题。例如,
binary_search(base, left, right, target) {
if (pow(base, left) == target)
return left;
if (pow(base, right) == target)
return right;
if (pow(base, (left + right) / 2) < target)
return binary_search(base, (left + right) / 2, right, target);
else
return binary_search(base, left, (left + right) / 2, target);
}
log(base, number) {
left = 1;
right = 2;
while(pow(base, p) < number) {
left = right;
right *= 2;
}
return binary_search(base, left, right, number);
}
如果只是简单地增加
p
,直到pow(base,p)
,那么这个naive 实现的时间复杂度为O(n),那么这个二分查找的时间复杂度肯定为O(log(n) ^2)。或者我对算法的衡量方式有误解吗?编辑:我通常不写二分查找,所以如果有微不足道的实现错误,请忽略它或进行修复。
pow
的复杂度是多少? - Josh Lee