Я пытаюсь понять двоичный поиск ошибка с byte
массив, я понял понятие переполнения, которое происходит при вычислении индекса mid
. Однако, когда я моделировать такое же поведение с помощью byte
массива следующим образом:Понимание двоичного поиска ошибка
public byte binarySearch(byte[] arr, byte low, byte high, byte value){
if(low>high){
return -1;
}
/* Line 1 */ byte overflow_mid = (byte) (((byte) (low + high))/2); // This line giving overflow behaviour
/* Line 2 */ byte mid = (byte) ((low + high)/2); // however this line doesn't, which is not what i expected
if(arr[mid]== value){
return mid;
}
if(arr[mid]>value){
return binarySearch(arr, low, (byte) (mid-1), value);
}
return binarySearch(arr, mid, high, value);
}
Интуиция:
Поскольку низкие и высокие переменные типа byte
, я считаю, что не нужно явное приведение byte
снова при расчете индекса в серединев строке 2.
Благодарности
Зачем использовать 'byte' для' low' и 'high'? Они являются значениями индекса, а не значениями массива, поэтому просто используйте 'int', и у вас не должно быть проблем с переполнением, и это устранит необходимость всех этих бросков dang. Значения индекса массива повышаются до 'int' в любом случае (см. [JLS 15.13. Выражения доступа к массиву] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.13)), поэтому вы ничего не спасаете. – Andreas
Да, вы абсолютно правы, но я пытаюсь понять ошибку, моделируя целочисленное поведение с помощью байтового индекса и байтового массива, поэтому я ожидаю, что он сработает. Просто из любопытства. –