正如其他人所提到的,二分搜索是 O(log2N),并且可以递归编码:
BinarySearch(A[0..N-1], value, low, high) {
if (high < low)
return -1 // not found
mid = (low + high) / 2
if (A[mid] > value)
return BinarySearch(A, value, low, mid-1)
else if (A[mid] < value)
return BinarySearch(A, value, mid+1, high)
else
return mid // found
}
或迭代:
BinarySearch(A[0..N-1], value) {
low = 0
high = N - 1
while (low <= high) {
mid = (low + high) / 2
if (A[mid] > value)
high = mid - 1
else if (A[mid] < value)
low = mid + 1
else
return mid // found
}
return -1 // not found
}
但是,如果您正在寻找最快的方法,您可以根据您的号码的sqrt(N-1) 设置查找表。只需 5,000 字的内存,您就可以通过这种方式实现 O(1) 查找。
解释:
由于对于从 1 到 N 的整数 N,所有数字的形式为 N^2 + 1,因此您可以创建一个包含 N 个元素的表。位置 i 处的元素将指定 i^2 + 1 是否在您的数组中。该表可以用一个长度为 N 的简单数组来实现。构建需要 O(N) 和 N 个单词的空间。但是一旦你有了表,所有的查找都是 O(1)。
例子:
这是 Python 中的示例代码,读起来像伪代码,一如既往:-)
import math
N = 5000
ar = [17, 26, 37, 50, 10001, 40001]
lookup_table = [0] * N
for val in ar:
idx = int(math.sqrt(val - 1))
lookup_table[idx] = 1
def val_exists(val):
return lookup_table[int(math.sqrt(val - 1))] == 1
print val_exists(37)
print val_exists(65)
print val_exists(40001)
print val_exists(90001)
建表最多占用O(N),查找O(1)。