Бинарный поиск, как уже упоминалось, имеет значение 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)
ваших номеров. С помощью всего лишь 5000 слов памяти вы можете достичь O (1) поиска таким образом.
Пояснение:
Поскольку все ваши числа имеют форму N ^ 2 + 1 для целого числа N от 1 до N, вы можете создать таблицу из 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).