贪心算法破解实现

时间:2015-10-29 13:00:54

标签: java algorithm for-loop arraylist linkedhashmap

我试图在下面实现一个贪心算法,所以我试图按照算法细节的要点,但我在我的IF语句中得到一个错误:java.lang。 IndexOutOfBoundsException:Index:4,Size:4 有谁知道以下方法是否应该如何接近这个?

  
      
  1. 使用第一种颜色为第一个顶点着色。
  2.   
  3. 对剩余的V-1顶点执行以下操作。

         

    a)考虑当前拾取的顶点并用它对其进行着色                以前没有使用过的最低编号颜色                与其相邻的彩色顶点。如果所有以前使用的颜色                出现在与v相邻的顶点上,为其指定一种新颜色。 * /

  4.   
public void greedy(LinkedHashMap<String, Node> nodes) {         
    ArrayList<Integer> colors = new ArrayList<Integer>();
    ArrayList<Integer> colorsUsed = new ArrayList<Integer>();

    nodes.entrySet().iterator().next().getValue().currentColor = 1; 
    colorsUsed.add(1);
    for (Map.Entry<String,Node> entry : nodes.entrySet()) {
        for (int i = 0; i < nodes.entrySet().size(); i++) {
            if(entry.getValue().edges.get(i).currentColor == 0) {
                //assign a color
                System.out.println(colors.get(i));
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您的嵌套循环没有多大意义并且它是异常的原因(您在节点数处停止i而不是每个节点的边数,因此索引i超出了集合entry.getValue().edges)的范围。

您应该替换

for (int i = 0; i < nodes.entrySet().size(); i++) {
                    ^^^^^^^^^^^^^^^^^^^^^^^
    if(entry.getValue().edges.get(i).currentColor == 0) {

类似

for (int i = 0; i < entry.getValue().edges.size(); i++) {
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    if(entry.getValue().edges.get(i).currentColor == 0) {

(假设Node#edged实现java.util.List)

此外,colors.get(i)也没有多大意义......

答案 1 :(得分:0)

IndexOutOfBoundsException告诉您,您的计划正在尝试访问您无法访问的ArrayList位置,因为其大小小于索引。如果您想了解有关此例外的更多信息,请查看here

你应该检查你的代码,特别是你的循环。