了解二进制搜索错误

时间:2016-04-05 05:28:44

标签: java algorithm debugging byte binary-search-tree

我试图了解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。

由于

2 个答案:

答案 0 :(得分:2)

让我们说byte low = 50, high = 100

表达式low + high将首先将两者都提升为int,然后添加它们,从而产生值150 (int)

在版本1中,您然后将150 (int)投射到byte,其值为-106 (byte)。 <强>溢出即可。与+相同,/运算符会将双方都提升为int,因此它变为-106 (int),除以-53 (int)时为2 }。最后,您再次投放到byte,最后得到-53 (byte)

在版本2中,您将150 (int)除以2,并且由于双方都已经int个值,因此不会进行任何宣传,最后是75 (int)。将其投放到byte会给您75 (byte)没有溢出

答案 1 :(得分:1)

你正在施展两个非常不同的价值观。

在第一行中,你要进行两次演员表演。第一个溢出。您将low + high的结果转换为字节,在您的情况下溢出。

但是,在您的第二行中,您将(low + high) / 2投射到byte,并假设lowhigh都是正数,这意味着结果{{1 }}必须是r,因为low < r < highlow都可以用high变量表示,因此结果byte和那里&#39 ; s没有溢出。