Java递归“查找中位数”算法异常错误

mharris7190

给定两个具有唯一整数元素的数组,即在两个数组内或两个数组之间重复元素:

这是我编写的一种递归算法,需要帮助来解密我收到的错误消息。

public class Median {
public static void main(String[] args)
{
    int[] arr1 = new int[]{1,2,3,4,5};
    int[] arr2 = new int[]{6,7,8,9,10};
    medianOfBoth(arr1, arr2);
}

public static int medianOfBoth(int[] arr1, int[] arr2)
{
    if (arr1.length <= 2 && arr2.length <= 2)
    {
        return compute_median(arr1, arr2);
    }

    else if (median(arr1) > median(arr2))
    {
        //erase top half of arr1 and bottom half of arr2
        arr1 = Arrays.copyOfRange(arr1, 0, median(arr1));
        arr2 = Arrays.copyOfRange(arr2, median(arr2), arr2.length - 1);
        return medianOfBoth(arr1, arr2);
    }

    else // if (median(arr1) < median(arr2))
    {
        arr1 = Arrays.copyOfRange(arr1, median(arr1), arr1.length - 1);
        arr2 = Arrays.copyOfRange(arr2, 0, median(arr2));
        return medianOfBoth(arr1,arr2);
    }
}

public static int median(int[] arr)
{
    return arr[arr.length/2];
}

public static int compute_median(int[] arr1, int[] arr2)
{
    //arr1 and arr2 are either length 1 or 2 in this function
    return (max(arr1[0], arr2[0]) + min(arr1[arr1.length-1], arr2[arr2.length-1])) / 2;
}

public static  int max(int x, int y)
{
    if (x>y)
        return x;
    else
        return y;
}

public static int min(int x, int y)
{
    if (x<y)
        return x;
    else
        return y;
}
}

这是我收到的错误消息

Exception in thread "main" java.lang.IllegalArgumentException: 4 > 0
at java.util.Arrays.copyOfRange(Arrays.java:2621)
at Median.medianOfBoth(Median.java:28)
at Median.medianOfBoth(Median.java:30)
at Median.main(Median.java:8)
斯瓦普尼尔·梅塔

稍微更改了您的代码。请看一下。

import java.io.*;

import java.util.*;

public class Main {

public static int median(int[] arr)

{

    return arr[arr.length/2];
}

public static int med(int[] arr)
{
    return arr.length/2;
}

public static  int max(int x, int y)
{
    if (x>y)
        return x;
    else
        return y;
}

public static int min(int x, int y)
{
    if (x<y)
        return x;
    else
        return y;
}

public static int compute_median(int[] arr1, int[] arr2)
{
    //arr1 and arr2 are either length 1 or 2 in this function
    return (max(arr1[0], arr2[0]) + min(arr1[arr1.length-1], arr2[arr2.length-1])) / 2;
}

public static int medianOfBoth(int[] arr1, int[] arr2)
{
    if (arr1.length <= 2 && arr2.length <= 2)
    {
        return compute_median(arr1, arr2);
    }

    else if (median(arr1) > median(arr2))
    {
        //erase top half of arr1 and bottom half of arr2
        //System.out.println("hi ="+med(arr2)+" "+arr2.length+"\n");
        arr1 = Arrays.copyOfRange(arr1, 0, med(arr1));
        arr2 = Arrays.copyOfRange(arr2, med(arr2), arr2.length);
        return medianOfBoth(arr1, arr2);
    }

    else // if (median(arr1) < median(arr2))
    {
        //System.out.println("bi ="+med(arr1)+" "+arr1.length+"\n");
        arr1 = Arrays.copyOfRange(arr1, med(arr1), arr1.length);
        arr2 = Arrays.copyOfRange(arr2, 0, med(arr2));
        return medianOfBoth(arr1,arr2);
    }
}

public static void main(String[] args)
{
    int[] arr1 = new int[]{1,2,3,4,5};
    int[] arr2 = new int[]{1,3,5,7,9};
    System.out.println(medianOfBoth(arr1, arr2));
}
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

查找数组的中位数

来自分类Dev

查找数组的中位数

来自分类Dev

中位数Java实现的中位数

来自分类Dev

查找图像列表的中位数

来自分类Dev

查找arrayList中位数的问题

来自分类Dev

查找2个大小相同的数组的中位数-O(log n)算法无法得出正确的结果

来自分类Dev

算法约简(中位数,快速排序)

来自分类Dev

快速排序算法-中位数三

来自分类Dev

通过C加号函数查找中位数

来自分类Dev

在Spark Streaming中查找中位数

来自分类Dev

查找中位数的简单方法

来自分类Dev

在彩色范围内查找中位数

来自分类Dev

Python- Quickselect函数查找中位数

来自分类Dev

查找随机数的中位数

来自分类Dev

使用选择排序查找数组的中位数

来自分类Dev

在Spark Streaming中查找中位数

来自分类Dev

Python 3.4,查找列表的中位数

来自分类Dev

在python中查找中位数时出错

来自分类Dev

快速查找输入中位数的方法

来自分类Dev

查找使用Java两个日期之间的时间中位数8

来自分类Dev

中位数算法中常数5来自何处?

来自分类Dev

不了解中位数算法以找到第k个元素

来自分类Dev

了解两个排序数组中位数的算法

来自分类Dev

Java:在中位数错误的索引上方打印数字

来自分类Dev

列表中位数的中位数

来自分类Dev

获取Java中位数的值范围

来自分类Dev

使用Java Stream API计算中位数

来自分类Dev

获取Java中位数的值范围

来自分类Dev

将递归组合查找算法转换为迭代算法,以避免超出GC开销限制错误