2015-09-09 4 views
4

Алгоритм, приведенный ниже, представляет собой вариант бинарного поиска, в котором вместо выбора среднего выбирается и сравнивается случайный индекс. Алгоритм асимптотически хуже, но это была просто задача. Алгоритм рассматривает случай, когда элемент со случайным индексом 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

- это ваши 'ключи []' 1-indexed? Если нет (и я чувствую, что это не так), измените условие 'if' на' if (n < 0 || n > = keys.length) ' – vish4071

+0

Я только что отредактировал ваш код, чтобы опубликовать эту идею в ответе. Теперь он должен работать. – vish4071

+0

Я не использую n в индексах, он используется как оценка для случайного, поэтому, если нет элементов (n = 0), то элемент не существует в массиве. Я также передаю n как keys.length, так что если (n> = keys.length) всегда будет возвращать false. – joe

ответ

3

Ваш код в корне неправильно (я думаю). Согласно тому, что вы говорите (условия в вашей постановке задачи), то это должно быть код:

public static boolean search(int[] keys, int value, int l, int r) 
{ 
    if(l < 0 || r >= keys.length || l>r) return false; 
    else 
    { 
     Random random = new Random(); 
     int i  = l + random.nextInt(r-l); 

     if(keys[i] == value) return true; 
     else if(keys[i] > value) return search(keys, value, l, i - 1); 
     else return search(keys, value, i + 1, r); 
    } 
} 
+0

Вы можете удалить все 'else'-s, они бесполезны здесь, так как' if'-s заканчивается 'return'. – CiaPan

+0

Да, это правда. Я только что скопировал и вставил его код и сделал минимальное редактирование, чтобы получить правильный ответ. :) – vish4071

2

Смотрите эту часть вашего кода,

else if(keys[i] > value) 
    return search(keys, value, i - 1); //Line1 
else 
    return search(keys, value, i + 1); //Line2 

Вы ищете в той же части массив в обоих случаях.

Line1 ищет value в массиве от 0 до i - 1.
Line2 ищет value в массиве от 0 до i + 1.

Что вы должны сделать это,

Line1 следует искать value в массиве из 0 в i - 1.
Line2 следует искать value в массиве от i + 1 до конца массива.

Смежные вопросы