【问题标题】:Recursion binary method in java not workingjava中的递归二进制方法不起作用
【发布时间】:2020-02-09 10:57:38
【问题描述】:

This is the code. Please tell me what I am doing wrong 所以这是一个使用递归方法进行二进制搜索的Java程序。它需要一个数组和一个搜索变量。

我知道有问题,但我不确定是什么问题。 我做错了什么以及如何改变它?

public static int binary(int arr[], int target) {
    int start = 0;
    int end = arr.length;
    int mid = (start+end)/2;

    if(end<start) {
        return -1;
    }

    if (arr[mid] == target) {
        return mid;
    }
    else if (arr[mid] > target) {
        start = mid + 1;
        int[] newArr = new int[end];
        for(int i=start;i<end;i++) {
            int j=0;
            newArr[0] = arr[i];
            j++;
        }
        return binary(newArr,target);
    } else {
        end = mid - 1;
        int[] newArr = new int[end];
        for(int i=start;i<end;i++) {
            newArr[i] = arr[i];
        }
        return binary(newArr,target);
    }
}

【问题讨论】:

  • 如果您在问题中发布minimal reproducible example,而不是某些代码的图片,您更有可能获得帮助;并详细描述您遇到的问题。
  • 请仅将您的问题放在标题中,然后提供详细信息。在此处分享代码将帮助想要回答您问题的人。
  • 请将您的代码发布为文本而不是图像!
  • 代码已贴出!

标签: java arrays if-statement recursion binary-search-tree


【解决方案1】:

我会指出,通过将数组的一部分复制到一个新的更小的数组中,您会削弱执行二进制搜索的价值。一个良好实现的二分搜索在 O(log(n)) 时间内运行,而您在这里所做的在 O(n) 时间内运行。相反,如果您想递归地实现二进制搜索,您应该只传递原始数组以及您当前正在考虑的上下限。

也就是说,您的代码甚至没有得到正确答案(更不用说快速得到答案)的原因是由于一些不同的错误。

  • 假设你的数组是按升序预排序的(如果你的数组没有排序,二分查找根本就不能工作),那么你就会遇到中点大于目标的情况其中中点小于反转的目标。
  • 用于复制数组高端的代码存在一些问题。提醒一下,如果您正在复制数组的一部分,那么您正在错误地进行二进制搜索。也就是说,在这种情况下,您的数组复制代码只会写入新数组 [0] 的起始索引,而不是同时沿着新数组和旧数组移动。

【讨论】:

  • 如果你可以重写要进行的更改,我可能会更好地理解
  • 有没有什么方法可以在不超过上限和下限的情况下递归地做到这一点?
猜你喜欢
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 2013-07-20
  • 1970-01-01
相关资源
最近更新 更多