Каков наилучший способ подсчитать средний индекс для рекурсивного или итеративного вызова - PullRequest
0 голосов
/ 01 мая 2020
1) int mid = (right+left)/ 2;
2) int mid = left + (right - left) / 2;

При практическом выполнении Java второй дает оптимизированный вызов функции (улучшенная временная сложность). Похоже, что оба дают одинаковые результаты для «средней» переменной для определенного «левого» и «правого» значения. Есть ли предпочтения или различия выше двух вариантов. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Это помогает? Они оба хороши для сравнительно небольших значений величин слева и справа. Но числа с большими величинами страдают от целочисленного переполнения.

int right = Integer.MAX_VALUE-100;
int  left = Integer.MAX_VALUE-120;

int newLeft = left + (right-left)/2;
System.out.println(newLeft);
newLeft = (right + left)/2;  // = -222/2 = -111
System.out.println(newLeft); // oops!

Отпечатки

2147483537
-111

И пока мы находимся в топи c, именно поэтому это плохая практика для реализации int компаратор вроде этого:

Comparator<Integer> comp = (a, b) -> a - b;

Когда это должно быть так

Comparator<Integer> comp  = (a, b) -> a > b ? 1 : a < b ? -1 : 0;
0 голосов
/ 01 мая 2020

(1) неточно и неправильно. (2) это исправление и правильность.

Вопрос не в сложности времени, а в точности.

Предположим, что right = 2,147,483,646 и left = 2,147,483,646. Добавление этих значений приведет к целочисленному переполнению .

Второму избежать переполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...