亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

找出矩陣中的最短路徑和。Dijkstra 不是最適合這種情況嗎?

找出矩陣中的最短路徑和。Dijkstra 不是最適合這種情況嗎?

Go
aluckdog 2021-10-18 10:10:07
我正在嘗試從項目 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 回答

  • 1 回答
  • 0 關注
  • 245 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號