在我们的算法类中,教授说如果在实现贪婪算法时我们陷入局部最大值并因此假设不可能再进行改进,则可能导致实现失败。有人可以举例说明何时会发生这种情况?
答案 0 :(得分:1)
想象一下你需要在数组中找到最大数字,它具有内聚值(类似于横向,近场之间的差异不能高于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作为全局最大值
正如您所看到的,此算法将转到本地maxmum并且无法离开