#java #поиск #производительность
Как ускорить код? При изменении ввода/вывода система отказывается принимать, поэтому нужно оставить неприкосновенный Scan. На данный момент проходит за 1070 мс, нужно ускорить до 1000 мс. Приветствуются любые идеи! import java.util.Scanner; class Main { public static boolean find(int search, int[] arr, int len) { boolean ret = false; int fst = 0; int lst = len - 1; if ( arr != null){ while (fst <= lst) { int mid = (fst + lst) >>> 1; if (search == arr[mid]) { ret = true; break; } else if (search < arr[mid]) { lst = mid - 1; } else { fst = mid + 1; } } } return ret; } public static void main(String[] args) { Scanner scan = new Scanner(System.in); int len = scan.nextInt(); int[] arr = new int[len]; int i; for (i = 0; i < len; i++) { arr[i] = scan.nextInt(); } int num = scan.nextInt(); int search; for (i = 0; i < num; i++) { search = scan.nextInt(); System.out.print((find(search, arr, len))? "YES\n" : "NO\n"); } } }
Ответы
Ответ 1
Не трогая собственно дихотомический поиск, предложу модификации: //убран лишний параметр len + упрощаем вызов private дешевле public private static boolean find(int search, int[] arr) { //boolean ret = false; //лишняя декларация - фтопку int mid; if ( arr == null) return false; int fst = 0; int lst = arr.length - 1; while (fst < lst) { mid = (fst + lst) >>> 1; //убираем декларацию mid - зачем нам лишнее движение в стеке? if (search == arr[mid]) return true; //убираем break else if (search < arr[mid]) lst = --mid; else fst = ++mid; } if(search==arr[fst]) //улучшаем асимптотику - то есть последний проход, когда fst==lst выносим за цикл return true; return false; }Ответ 2
Записывай числа не в массив, а в HashSet. Бинарный поиск по массиву работает за O(ln(n)), а проверка наличия элемента в HashSet-е может выполниться за O(1). Если проблема с производительностью была НЕ из-за долгого поиска, или если есть специальные проверки, учитывающие особенности реализации хэш-функции, то не сработает. Но в общем случае должно помочь.Ответ 3
Считывание из файла за 940мс прошло. Не понимаю правда почему из файла быстрее, но это сработало. Сама задача https://www.e-olymp.com/ru/problems/3966 import java.io.*; import java.util.*; import java.lang.*; public class test1 { public static boolean find(int search, int[] arr, int len) { boolean ret = false; int fst = 0; int lst = len - 1; while (fst <= lst) { int mid = (fst + lst) / 2; if (search == arr[mid]) { ret = true; break; } else if (search < arr[mid]) { lst = mid - 1; } else { fst = mid + 1; } } return ret; } public static void main(String[] args) throws FileNotFoundException { final Scanner scan = new Scanner(new BufferedInputStream(new FileInputStream(new File("input.txt")))); final PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream(new File("output.txt")))); int len = scan.nextInt(); int[] arr = new int[len]; int i; for (i = 0; i < len; i++) { arr[i] = scan.nextInt(); } int num = scan.nextInt(); int search; for (i = 0; i < num; i++) { search = scan.nextInt(); out.print((find(search, arr, len))? "YES\n" : "NO\n"); } scan.close(); out.flush(); out.close(); } }
Комментариев нет:
Отправить комментарий