峰值发现算法错误

时间:2016-06-14 13:55:18

标签: java arrays algorithm

大家好,有人可以用我的代码帮助我

如果你想知道什么是找高峰

,这是一个寻找高峰的代码

你去吧

给定一个整数数组。找到其中的峰值元素。如果数组元素不小于其邻居,则它是峰值。对于角落元素,我们只需要考虑一个邻居。例如,对于输入数组{5,10,20,15},20是唯一的峰值元素。对于输入数组{10,20,15,2,23,90,67},有两个峰值元素:20和90.请注意,我们需要返回任何一个峰值元素。

我的问题是,如果我的代码找不到峰值元素 它位于数组的第一个位置或最后一个位置

这是我的代码很简单

    public static void main(String[] args) {



    int [] arr = {1,2,3,4,1,3,3,7,8,2,16};
    peakFinding(arr, 0,arr.length);

}


public static void peakFinding(int [] arr,int start ,int end){
    int mid  = (start+end)/2;



    if(arr[mid]<=arr[mid+1]){
            start = mid;
            end = arr.length;

            peakFinding(arr, start, end);
        }else if(arr[mid]<=arr[mid-1]){

            start = 0;
            end = mid-1;
            peakFinding(arr, start, end);
        }else{
            System.out.println("I have found peak "+arr[mid]);
        }

}

3 个答案:

答案 0 :(得分:1)

鉴于您只需要找到一个元素,并且选择是任意的,请考虑将边视为特殊情况。在致电peakFinding之前包含

形式的代码
if (arr == null || arr.length < 2){
    /*do nothing, no elements*/
} else if (arr[0] >= arr[1]){
    /*first element is peak*/
} else if (arr[arr.length - 1] >= arr[arr.length - 2]){
    /*last element is peak*/
} else {
    /*call peakFinding*/
}

我的第一张检查也修复了您可能遇到的潜在错误。

这样做可以保持程序复杂部分的清晰度。

最后,考虑将peakFinding的返回类型更改为返回元素的位置(return mid;),然后输出消息将在一个位置进行编码。 / p>

答案 1 :(得分:1)

在回答你的问题之前,我觉得你的peakFinding的起始部分看起来并不是很好,而不是

int mid  = (start+end)/2;

如果开始和结束太大并且接近Integer.MAX_VALUE可能会出现问题,请尝试

int mid = start + (end - start) / 2;

另外,如果你添加一些代码来验证输入(对数组进行空检查,或者开始&lt; =结束那样的事情),那就更好了。

现在让我们谈谈你的算法,它是一个二进制搜索。

public static void peakFinding(int [] arr,int start ,int end){

while(start + 1 < end) {
    int mid = start + (end - start) / 2;
    if(arr[mid] <= arr[mid+1]) {
        start = mid;
    } else if (arr[mid] <= arr[mid-1]) {
        end = mid;
    } else {
        System.out.println(arr[mid]);
        return;
    }
}

if(arr[start] > arr[end]) {
    System.out.println(arr[start]);
} else {
    System.out.println(arr[end]);
}

}

答案 2 :(得分:0)

您的程序找不到所有峰值。

如果是第一个arr[mid] <= arr[mid + 1]子句中的条件if返回true,这意味着仅在数组的右侧部分搜索峰值。不再搜索数组的左侧部分,尽管在数组的左侧也可能存在峰值。