從總體上看,我正在嘗試使用優(yōu)先級隊列來實現(xiàn)Dijkstra的算法。根據(jù)golang-nuts的成員所述,Go中慣用的方法是將堆接口與自定義的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)一起使用。因此,我像這樣創(chuàng)建了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)確實使編譯器滿意。但是我不明白為什么我會首先收到錯誤消息。推送不會以任何方式修改參數(shù)。
- 1 回答
- 0 關(guān)注
- 276 瀏覽
添加回答
舉報
0/150
提交
取消