我正在嘗試從項目 euler解決以下問題(請查看鏈接中的描述和示例,但這里是簡短的解釋)。在矩陣中,通過向左、向右、向上和向下移動,找到從左上角到右下角的最小路徑和在我看到問題之后,我想到的顯而易見的解決方案是從矩陣創建一個圖形,然后使用Dijkstra找到最短路徑。要從N*M矩陣構造圖,(i, j)我為每個元素創建一個頂點i * N + j并將其連接到任何其他頂點(可以與 UP、RIGHT、DOWN、LEFT 連接),邊將是元素的值我我連接到矩陣中。之后,我創建了另外 2 個-1連接到頂點的頂點,0并-2連接到N*M - 1它們將是我的開始和結束頂點(兩個連接的成本均為 0)。在此之后,我正在做 Dijkstra 以找到從-1到 的最短路徑成本-2。我的 Dijkstra 實現使用優先級隊列,看起來像這樣:func dijkstraCost(graph map[int]map[int]int, start, end int) int{ if start == end{ return 0 } frontier := make(PriorityQueue, 1) frontier[0] = &Item{value: start, priority: 0, index: 0} visited := map[int]bool{} heap.Init(&frontier) for frontier.Len() > 0 { element := heap.Pop(&frontier).(*Item) vertex, cost := element.value, element.priority visited[vertex] = true neighbors := graph[vertex] for vertex_new, cost_new := range(neighbors){ if !visited[vertex_new]{ if vertex_new == end{ return cost + cost_new } heap.Push(&frontier, &Item{ value: vertex_new, priority: cost + cost_new, }) } } } return -1}其中 Priority Queue 實現取自堆容器(示例 PriorityQueue),并進行了一個小的修改:func (pq PriorityQueue) Less(i, j int) bool { return pq[i].priority > pq[j].priority // changed to <}這工作正常,但問題是它被認為效率低下(根據問題的Hackerrank 版本判斷)。它應該700x700在不到 4 秒的時間內找到矩陣的最佳解決方案的值,而我的解決方案需要 10 秒。我認為我在 go 中做錯了什么,所以我在 python 中重新實現了相同的解決方案(其中 700x700 矩陣大約需要 70 秒)我的問題是:我是否使用正確的方法在矩陣中找到最佳解決方案。如果是這樣,我的實現有什么問題?PS我有完整的解決方案和python解決方案,只是認為即使沒有它們,問題也太長了。
- 1 回答
- 0 關注
- 245 瀏覽
添加回答
舉報
0/150
提交
取消