У меня есть задание от моего профессора CS:
Найти, за O (logn) время, если в заданном предварительно отсортированном массиве различных целых чисел есть индекс i, так что массив [i] = я.Докажите, что время O (logn).
Обновление: Целые числа могут быть отрицательными, 0 или положительными.
Хорошо, поэтому я немного боролся с этим.Моя идея такова:
Используя бинарный поиск, мы можем быть уверены, что такого значения нет слева от среднего элемента, если array [mid] <= startindex, где mid - индекс среднего элемента,и startindex - начало массива. </p>
Соответствующее правило для правой половины массива - это массив [mid]> = startindex + цифра, где переменные, как указано выше, и цифра - это число элементов справа от середины..
Это не похоже на O (logn), так как в худшем случае мне приходится перебирать все это, верно?Может кто-нибудь подсказать мне в правильном направлении или сказать, что это работает?
Есть идеи, как я могу формально доказать это?Я не прошу однозначного ответа, больше помогу понять.
В C:
int _solve_prob_int(int depth, int start, int count, int input[])
{
if(count == 0)
return 0;
int mid = start + ((count - 1) / 2);
if(input[mid] == mid)
return 1;
if(input[mid] <= start && input[mid] >= start + count)
return 0;
int n_sub_elleft = (int)(count - 1) / 2;
int n_sub_elright = (int)(count) / 2;
if(input[mid] <= start)
return _solve_prob_int(depth + 1, mid + 1, n_sub_elright, input);
if(input[mid] >= start + count)
return _solve_prob_int(depth + 1, mid - n_sub_elleft, n_sub_elleft, input);
return _solve_prob_int(depth + 1, mid - n_sub_elleft, n_sub_elleft, input) ||
_solve_prob_int(depth + 1, mid + 1, n_sub_elright, input);
}
Тестовый пример:
Sorted args: 1 2 3 4 5 6 7 8 9 10 11 12 :
Start: 0, count: 12, mid: 5 value: 6
Start: 0, count: 5, mid: 2 value: 3
Start: 0, count: 2, mid: 0 value: 1
Start: 1, count: 1, mid: 1 value: 2
Start: 3, count: 2, mid: 3 value: 4
Start: 4, count: 1, mid: 4 value: 5
Start: 6, count: 6, mid: 8 value: 9
Start: 6, count: 2, mid: 6 value: 7
Start: 7, count: 1, mid: 7 value: 8
Start: 9, count: 3, mid: 10 value: 11
Start: 9, count: 1, mid: 9 value: 10
Start: 11, count: 1, mid: 11 value: 12
выше моя программа запускается с некоторым выводом в соответствии с тем, как она искала.Со списком от 1 до 12 он поворачивается вокруг индекса 5, определяя, что может быть значение между 0-4 и индексами 0-4.Он также определяет, что может быть значение между 6-11 и индексами 6-11.Таким образом, я приступаю к поиску их обоих.Это неправильно?