检测局部最小值和最大值,java

问题描述 投票:3回答:4

给出的是像23 7 13 4 8 6这样的整数序列。我想使用以下规则检测局部最小值和最大值:

  • 当后面的数字更大时,序列中的第一个数字是局部最小值
  • 当最后一个数字较大时,序列中的最后一个数字是局部最小值
  • 序列中的数字小于前一个和后一个数字时,它是局部最小值

我可以使用方法hasNextIntgetNextInt

目前,我正在考虑该算法。但是我不确定我是否理解逻辑。首先,我建立一个tuple并比较其数字。例如。我将23和7进行比较。7是本地最小值。那我该怎么办?建立一个triple?但是那个三倍数是23 7 13或13 4 8?我不确定。

有什么想法吗?

更新:

假设我们将左邻居和该数字存储在三个数字的中间:

left    middle    current

0        0         23

23       0         7

23       7         13 <- you have a triple, compare => minimum 7

然后会发生什么?将var设为0,然后从下一个数字4开始?还是在左边存储7,在中间存储13以使当前为4?

更新(此代码似乎起作用):

    int left   = 0;
    int center = 0;
    while(hasNextInt()){
        int current = getNextInt();

        if((left != 0) && (center != 0)){
            if(current > center && center < left){
                System.out.println("Min: "+center);
                left = center; center = current;
            }else{
                left = center; center = current;
            }
        }else if((left != 0) && (center == 0)){
            if(left < current){
                System.out.println("Min: "+left);
                center = current;
            }else{
                center = current;
            }
        }else if((left == 0) && (center == 0)){
            left = current;
        }
    }

    if(left > center){
        System.out.println("Min: "+center);
    }

感谢您的帮助!

java algorithm comparison
4个回答
2
投票

您在那里拥有的东西似乎是一个不错的开始。

但是,仅查看元组是不够的,因为您必须查看三个数字才能检测出局部最小值-因此必须扩展算法。

要了解如何执行此操作,请尝试在纸上编写一个简单示例。您将如何手动查找局部最小值?您可以在程序中做类似的事情吗?

随时发布您程序的更新版本(通过编辑问题,在底部添加新代码,然后如果您仍然遇到问题,我们可以提供帮助。

进行您的编辑:

然后会发生什么?设置变量到0并从下一个数字4开始?或者在左侧存储7,在中间存储13当前有4个?

您不能将所有内容都设置为0;您仍然需要三元组的最后两个数字才能开始下一个三元组,因为三元组的行为就像一个在数字列表上滑动的窗口(这通常被称为“滑动窗口”技术,因为许多算法都在使用它)。

您可以手动将数字复制到其新变量。

为了获得更多的优雅,您可以在单独的“ Triplet”类中实现此功能。要考虑的想法:该课程可以检查最小值,然后让您添加一个新数字,自动“推出”最旧的数字。


4
投票

这里是一个建议:

private void findMin() {

    int count = 0; // To handle special case of singleton list

    int left  = Integer.MAX_VALUE;
    int mid   = Integer.MAX_VALUE;
    int right = Integer.MAX_VALUE;

    while (hasNextInt()) {
        count++;
        left = mid;
        mid = right;
        right = getNextInt();

        if (right > mid && mid < left)
            System.out.println("local min: " + mid);
    }

    if (count > 1 && right < mid)
        System.out.println("local min: " + right);
}

1
投票

跟踪您以前是否使用两个布尔值增加或减少。当您读取数组中的下一个数字时,请再次检查并比较4个布尔值:

local_minimum = previously_decreased && just_increased;
local_maximum = previously_increased && just_decreased;

然后先存储->先前,然后继续。

开始时,两个previous_布尔值都应设置为true。最后,您将需要另一遍循环,将just_ booleans都设置为true。

显然,这些增加/减少布尔值是严格的,因此相等的值会将两个布尔值都设为false。

希望有所帮助。


1
投票

按照定义,在序列中间的某处想到一个三元组:

... A, B, C,  ...

显然是B局部最小值(如果且仅当A-B > 0 && B-C <0

否则,B局部最大值:A-B < 0 && B-C >0

没什么特别的

如果实现此逻辑,并遍历列表,特别是在末端处理案例,您应该能够在O(n)中找到所有局部最优值。

© www.soinside.com 2019 - 2024. All rights reserved.