【问题标题】:i am typing two codes which according to me are exactly same but why they are giving two different outputs that i dont know why我正在输入两个代码,根据我的说法,它们完全相同,但为什么它们会给出两个不同的输出,我不知道为什么
【发布时间】:2023-01-22 19:59:46
【问题描述】:
import java.util.*;
public class practice
{
    public static void main(String[] args) {
        char[] arr ={'c','f','j'};
        char target = 'c';
        System.out.println(search(arr,target));
    }

    static char search(char[] arr, char target)
    {
        int start =0;
        int end =  arr.length-1;
        while(start<=end)
        {
            int middle = start+(end-start)/2;
            if(target>arr[middle])
            {
                start = middle+1;
            }
            else
            {
                end = middle-1;
            }
        }

        return arr[start% arr.length];
    }
}

这是给'c​​'作为输出

根据编码平台的预期输出是“f” 可以通过下面的附加代码获得。

import java.util.*;
public class practice
{
    public static void main(String[] args) {
        char[] arr ={'c','f','j'};
        char target = 'c';
        System.out.println(search(arr,target));
    }

    static char search(char[] arr, char target)
    {
        int start =0;
        int end =  arr.length-1;
        while(start<=end)
        {
            int middle = start+(end-start)/2;
            if(target<arr[middle])
            {
                end = middle-1;
            }
            else
            {
                start = middle+1;
            }
        }

        return arr[start% arr.length];
    }
}

这是给'f'作为输出

我无法理解这种二进制搜索方法,为什么在这两种情况下我的答案都不一样,我无法注意到程序的流程。

【问题讨论】:

    标签: java binary-search


    【解决方案1】:

    如果比较这两个 sn-ps,它们几乎相同,除了 if-else

    第一个SN-P:

    if (target > arr[middle])
        start = middle + 1;
    else
        end = middle - 1;
    

    第二个SN-P:

    if (target < arr[middle])
       end = middle - 1;
    else
       start = middle + 1;
    

    现在这里有什么区别?第一个 sn-p 基本上说“如果我们正在搜索的值大于基准值(arr[middle]),则继续在值中搜索目标值更大比支点;否则,搜索值更小比支点”。

    else 案例在这里是错误的:如果 target &lt;= arr[middle],您将排除基准 arr[middle]。特别是,如果 target == arr[middle],您将排除主元,即使它等于您的目标值!这显然是不正确的,可能会导致错误的答案。

    第二个 sn-p 也有同样的问题。

    问题是两个 sn-ps 都没有正确处理 target == arr[middle]。这可以很容易地修补如下:

    if (target < arr[middle])
       end = middle - 1;
    else if (target > arr[middle])
       start = middle + 1;
    else // must be equal
       return arr[middle];
    

    【讨论】:

      猜你喜欢
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多