“Java中的算法,第5部分”一书(Sedgewick)的补充代码

时间:2011-12-18 00:10:31

标签: java algorithm

我们学院正在学习“高级算法”课程,我们每个人都有一个任务来描述“Java中的算法”一书中的特定算法。我们还必须实现本书中的代码(当然是Java),以展示算法如何在一个具体的例子上工作。

本书中已经提供了我们必须用于图形,节点,边缘等的类,但在我看来(以及其他一些学生),代码中有一些错误会阻止它编译。

我设法找到的唯一实现是: http://www.cs.princeton.edu/~rs/Algs3.java5/code.txt 但这与本书中的代码相同,但它不起作用。

我遇到问题的代码在这里:

  GraphSPT(Graph G, int s)  
  { int V = G.V(), N = 0;
    wt = new double[V]; spt = new Edge[V]; 
    for (int v = 0; v < V; v++) wt[v] = maxWT; 
    intQueue Q = new intQueue(G.E());
    wt[s] = 0.0; Q.put(s);  Q.put(V);
    while (!Q.empty()) 
    { int v;
      while ((v = Q.get()) == V) 
        { if (N++ > V) return; Q.put(V); }
      AdjList A = G.getAdjList(v);
      for (Edge e = A.beg(); !A.end(); e = A.nxt()) /* this line is the one with the problem */
        { int w = e.other(v); 
          double P = wt[v] + e.wt();
          if (P < wt[w]) 
            { wt[w] = P; Q.put(w); spt[w] = e; }
        }
    }
  }

我标记了有问题的一行。前一行中的AdjList是一个接口,但getAdjList()方法返回一个AdjLinkedList类的实例,该实例包含beg(),end()和nxt()方法的实现。出现问题是因为它们返回整数,而不是Edge类的实例。如果我将for循环中的初始化程序更改为“int e ...”,则循环内的代码不起作用,因为它调用“e”对象上的other()和wt()方法。

是否有人可能遇到同样的问题,或者是否有人知道该书中是否有可供下载的工作代码实施?

P.S。允许使用本书中的类,我只需要使用我自己的代码来表示图形,如果类实际工作的话,这根本不会成为问题:)

1 个答案:

答案 0 :(得分:0)

如果A.end()返回一个布尔值(或整数0/1),表示它是否在列表的末尾,那么A.beg()可能返回一个布尔值(或整数0) / 1)指定它是否在列表的开头。因此,编写示例代码的人可能与编写Edge代码并且期望beg()函数具有不同功能的人不同。