У меня есть отсортированный список целых чисел в txt файле (он общедоступен в Интернете), и мне нужно попросить пользователя указать номер для поиска в этом списке целых чисел через двоичный поиск.
Я вошел в курс алгоритмов, и я новичок в Java.
С кодом, который у меня есть, я получаю следующие ошибки:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 52, Size: 22
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at BinSearch4.main(BinSearch4.java:67)
* Цикл while (перечисленный ниже) является линией 67
Не может показаться, что проблема здесь. Кроме того, я уверен, что даже некоторые из вещей, которые у меня есть, могут быть реализованы более эффективно. Любая помощь, которую любой может предоставить, будет очень признательна.
/* Binary Search Algorithm
*
* - Import a sorted list of integers of an unknown length
*
* - Ask the user for a number to search for (searchValue)
*
* - Run a Binary Search on the list of integers without simply using binarySearch
*
* - Return the index of an occurrence of the search number (searchValue)
*
* - Or -1 if the target is not found.
*
*
*/
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.Scanner;
import java.util.ArrayList;
public class BinSearch4 {
public static void main(String[] args) throws IOException {
URL url = new URL("http://m.uploadedit.com/ba3a/1423978916244.txt");
ArrayList<Integer> arrList = new ArrayList<Integer>();
int searchValue;
int low;
int high;
int mid;
int NOT_FOUND = -1;
Scanner in = new Scanner(System.in);
System.out.println("Enter your number to search for:");
searchValue = in.nextInt();
System.out.println(searchValue);
try {
Scanner scr = new Scanner(url.openStream());
while (scr.hasNextLine()) {
int i = scr.nextInt();
arrList.add(i);
}
scr.close();
System.out.println(arrList);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
low = arrList.get(0);
System.out.println(low);
high = arrList.get(arrList.size() - 1);
System.out.println(high);
mid = (low + high) / 2;
while (low <= high && arrList.get(mid) != searchValue) {
if (arrList.get(mid) < searchValue) {
low = mid + 1;
} else {
high = mid - 1;
}
mid = (low + high) / 2;
}
if (low > high) {
mid = NOT_FOUND;
}
System.out.println(mid);
}
}
Список номеров в текстовом файле: [-2, 3, 6, 9, 11, 22, 24, 31, 35, 43, 48, 52, 62, 65, 69, 70, 73, 83, 86, 90, 100, 107]
Двоичный поиск
public class BinarySearch {
public int binarySearch(int[] a) {
int start = 0;
int end = a.length - 1;
int searchedValue = 70;
for (int i = 0; i <= a.length; i++) {
int mid = (start + end) / 2;
if (searchedValue == a[mid]) {
return 1;
}
if (searchedValue < a[mid]) {
end = mid - 1;
} else {
start = mid + 1;
}
}
return -1;
}
public static void main(String[] args) {
int a[] = { 2, 5, 40, 50, 60, 70 };
BinarySearch binarySearch = new BinarySearch();
System.out.println(binarySearch.binarySearch(a));
}
}
start должно быть 0, а end - arr.length-1
Благодаря android_dev и almas здесь они оба были правильными.
Здесь, в этом месте в моем исходном коде, размещенном здесь:
low = arrList.get(0);
System.out.println(low);
high = arrList.get(arrList.size() - 1);
Я ссылался на значение, мне нужно было ссылаться на индекс. Следовательно, индекс "низкий" всегда и всегда должен быть равен нулю для такой программы бинарного поиска.
Мой правильный код, который теперь работает:
low = 0;
System.out.println(low);
high = arrList.size() - 1;
Измените свои строки:
low = arrList.get(0);
System.out.println(low);
high = arrList.get(arrList.size() - 1);
к
low = 0;
System.out.println(low);
high = arrList.size() - 1;
Причина, по которой вы получаете исключение, состоит в том, что если у вас есть 10 элементов в вашем списке и вы говорите, что у вас есть 100 - 110 в качестве элементов в списке, вы пытаетесь получить доступ к элементу списка по индексу, т.е. 100, который не существует в вашем списке в качестве списка содержит только 10 элементов, т.е. доступ к элементам за пределами индекса 9 (поскольку индекс массива начинается от 0 до n-1), вы получите IndexOutOfBoundsException
.
BinSearch4.java
строку № 67 в файлеBinSearch4.java
.