Algorithm 贪婪算法中的局部极大值与全局极大值

Algorithm 贪婪算法中的局部极大值与全局极大值,algorithm,Algorithm,在我们的算法课上,教授说,如果在实现贪婪算法时,我们停留在局部最大值上,因此假设不可能有更多的改进,那么可能会导致实现失败。有人能举个例子说明什么时候会发生这种情况吗?想象一下,你需要在一个数组中找到最大数,这个数组具有内聚值(类似于横向,近场之间的差值不能大于1)。出于性能原因,您不想检查所有值。您可以尝试一种简单的贪婪算法,如:检查一个接近的值,如果值较高,则朝这个方向,如果值较低,则朝另一个方向: public static void findHighestValue(int[] land

在我们的算法课上,教授说,如果在实现贪婪算法时,我们停留在局部最大值上,因此假设不可能有更多的改进,那么可能会导致实现失败。有人能举个例子说明什么时候会发生这种情况吗?

想象一下,你需要在一个数组中找到最大数,这个数组具有内聚值(类似于横向,近场之间的差值不能大于1)。出于性能原因,您不想检查所有值。您可以尝试一种简单的贪婪算法,如:检查一个接近的值,如果值较高,则朝这个方向,如果值较低,则朝另一个方向:

public static void findHighestValue(int[] landscape){
    boolean leftChecked = false;
    boolean rightChecked = false;
    // we start in the middle of that array
    int currentIndex = landscape.length / 2;
    // do work until both directions are checked
    while(!leftChecked || !rightChecked){
        //check left boundary
        if(currentIndex == 0)
            leftChecked = true;
        //check right bound
        if(currentIndex == landscape.length - 1)
            rightChecked = true;
        //first check if left value is equal or higher then current value
        if(!leftChecked){
            if(landscape[currentIndex - 1] >= landscape[currentIndex]){
                currentIndex--;
            } else {
                leftChecked = true;
            }
        } else if(!rightChecked) {
            //same for right side
            if(landscape[currentIndex + 1] >= landscape[currentIndex]){
                currentIndex++;
            } else {
                leftChecked = true;
            }
        }
    }
    //print the result
    System.out.println("local maximum at index: " + currentIndex);
}
现在试着用如下值调用该方法:{1,1,2,3,4,5,4,4,3,2,3,4,5,6,7,6,5}。根据算法的起点,它将发现5为局部最大值,7为全局最大值


如您所见,该算法将进入局部最大值,无法离开它

什么示例?陷入局部极大值?@JohnnyAW是的,陷入局部极大值并给出错误的答案。很抱歉,我不理解你所说的内聚值是什么意思?这意味着,这些值与相邻值相关,就像一幅风景,如果你的值为1,那么你的下一个值可能为9,在景观中,该值更有可能为2。我会在回答中给出一个数组示例,但是为什么我们要使用这个策略来查找最大元素呢。例如,假设我的数组是5 4 3 2 3 4 4 4 4,它将从元素3开始,注意它应该向右移动,从那以后它将继续向右移动,并声明4是最大元素,而实际上是5。有时你不能使用算法,这将在每种可能的情况下给你一个正确的答案,因为要计算出正确的答案需要很多时间。在这种情况下,您只需使用一个启发式算法,它将计算出一个“好”答案(它可能是最好的答案,但不能保证这一点)。贪婪算法是一种启发式算法,它试图在短时间内计算出一个“好”答案。您需要平衡计算时间和计算结果的“好”程度answer@s_123想象一下航空公司,他们想用100架飞机、1000名飞行员等计算100个机场最赚钱的航线,他们根本无法一次计算全部,因为这个问题呈指数增长,他们可能需要几天甚至几年的时间来计算出最佳答案。而不是这样做,他们只是使用启发式算法,这将给他们一个“好”的答案