从总体上看,我正在尝试使用优先级队列来实现Dijkstra的算法。根据golang-nuts的成员所述,Go中惯用的方法是将堆接口与自定义的基础数据结构一起使用。因此,我像这样创建了Node.go和PQueue.go://Node.gopackage pqueuetype Node struct { row int col int myVal int sumVal int}func (n *Node) Init(r, c, mv, sv int) { n.row = r n.col = c n.myVal = mv n.sumVal = sv}func (n *Node) Equals(o *Node) bool { return n.row == o.row && n.col == o.col}和PQueue.go:// PQueue.gopackage pqueueimport "container/vector"import "container/heap"type PQueue struct { data vector.Vector size int}func (pq *PQueue) Init() { heap.Init(pq)}func (pq *PQueue) IsEmpty() bool { return pq.size == 0}func (pq *PQueue) Push(i interface{}) { heap.Push(pq, i) pq.size++}func (pq *PQueue) Pop() interface{} { pq.size-- return heap.Pop(pq)}func (pq *PQueue) Len() int { return pq.size}func (pq *PQueue) Less(i, j int) bool { I := pq.data.At(i).(Node) J := pq.data.At(j).(Node) return (I.sumVal + I.myVal) < (J.sumVal + J.myVal)}func (pq *PQueue) Swap(i, j int) { temp := pq.data.At(i).(Node) pq.data.Set(i, pq.data.At(j).(Node)) pq.data.Set(j, temp)}和main.go :(动作在SolveMatrix中)// Euler 81package mainimport "fmt"import "io/ioutil"import "strings"import "strconv"import "./pqueue"const MATSIZE = 5const MATNAME = "matrix_small.txt"func main() { var matrix [MATSIZE][MATSIZE]int contents, err := ioutil.ReadFile(MATNAME) if err != nil {问题是,在编译时我收到错误消息:[~/Code/Euler/81] $ make6g -o pqueue.6 Node.go PQueue.go6g main.gomain.go:58: implicit assignment of unexported field 'row' of pqueue.Node in function argumentmake: *** [all] Error 1并且注释掉行PQ.Push(firstNode)确实使编译器满意。但是我不明白为什么我会首先收到错误消息。推送不会以任何方式修改参数。
1 回答
- 1 回答
- 0 关注
- 245 浏览
添加回答
举报
0/150
提交
取消