考虑一个示例70
,其中最接近的数字是64
,即2^6
。所以最小绝对差值为6
对这类问题(lg n
时间复杂度)的好方法是什么?
编辑:b
和x
为integers
编辑:1 < n < 10^9
其中n
是必须找到最小绝对差值的数字。假设q
查询即将到来且1 < q < 10^5
答案 0 :(得分:6)
你可以找到你的数字的第k个根,对于所有合理的k值,向上和向下舍入,找到哪个产生最接近n的值。
一旦n的第k个根小于2,就可以停止这个算法,这意味着要找到O(log n)个根。
以下是一些实现此功能的Python代码:
int(pow(n, 1/k)) == 1
当k最多为lg(n)+1时发生终止条件FILE* output_file = safe_open_file("task_1_bst.csv", "w");
fprintf(output_file, "timestamp,latitude,longitude,magnitude\n");
eq_print(output_file, sorted_arr[longest_index-1]);
fprintf(output_file, "\n");
eq_print(output_file, sorted_arr[longest_index-1]);
fprintf(output_file, "\n");
eq_print(output_file, sorted_arr[longest_index]);
fclose(output_file);
,因此该算法为O(log n),假设math.pow为O(1)。
答案 1 :(得分:3)
我有一个O(sqrt(n))
复杂度的解决方案。对于给定的数字n
,请k = ceil(sqrt(n))
。现在,可以使用以下Python代码计算最小绝对差值:
import math
n = int(raw_input('Enter a number: '))
k = int(math.sqrt(n))
minimum = 2147486347
for i in range(2, k+1):
p = int(math.log(n)/math.log(i))
if p > 1:
minimum = min(minimum, abs(n-i**p))
if p >= 1:
minimum = min(minimum, abs(n-i**(p+1)))
print minimum