Алгоритм, приведенный ниже, представляет собой вариант бинарного поиска, в котором вместо выбора среднего выбирается и сравнивается случайный индекс. Алгоритм асимптотически хуже, но это была просто задача. Алгоритм рассматривает случай, когда элемент со случайным индексом i равен поисковому значению, в этом случае он возвращает true, а второй случай, когда элемент с индексом i больше, чем значение поиска, и в этом случае мы рекурсивно вызываем поиск на входе n i - 1. И если элемент всегда больше или равен поисковому значению, алгоритм работает нормально.Рандомизированный алгоритм бинарного поиска
Однако что происходит, когда элемент рандомизированного индекса меньше значения поиска? Интуитивно я думал, что вход н должен увеличиться я + 1 и даже с проверкой, если п становится больше, чем размер массива, я, кажется, получают stackoverflows ..
public static boolean search(int[] keys, int value, int n) {
if(n <= 0 || n > keys.length)
return false;
else {
Random random = new Random();
int i = random.nextInt(n);
if(keys[i] == value)
return true;
else if(keys[i] > value)
return search(keys, value, i - 1);
else
return search(keys, value, i + 1);
}
}
- это ваши 'ключи []' 1-indexed? Если нет (и я чувствую, что это не так), измените условие 'if' на' if (n < 0 || n > = keys.length) ' – vish4071
Я только что отредактировал ваш код, чтобы опубликовать эту идею в ответе. Теперь он должен работать. – vish4071
Я не использую n в индексах, он используется как оценка для случайного, поэтому, если нет элементов (n = 0), то элемент не существует в массиве. Я также передаю n как keys.length, так что если (n> = keys.length) всегда будет возвращать false. – joe