gpt4 book ai didi

algorithm - 结构 slice 使用太多内存

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:08 27 4
gpt4 key购买 nike

我试图解决 this BFS 的问题,但是对于输入“99 100”,我的程序使用了超过 260 Mb 并且在线判断系统抛出 MEMORY_LIMIT_EXCEEDED。我想问题是我使用 QUEUE 的方式。那么你认为问题是什么?又该如何解决?

这是我的代码。提前致谢!:

package main

import (
"fmt"
)

type pair struct {
nn int
dd int
}

func main() {
var n, m int
fmt.Scanf("%d%d", &n, &m)

if n >= m {
fmt.Println(n - m)
} else {
device := make([]pair, 1)
device[0] = pair{n, 0}

ans := 0
for {
// pop front element
tmp := device[0]
device = device[1:]

if tmp.nn == m { // reached destination
ans = tmp.dd
break
}

// add neighbors to the queue
device = append(device, pair{tmp.nn - 1, tmp.dd + 1})
device = append(device, pair{tmp.nn * 2, tmp.dd + 1})
}

fmt.Println(ans)
}
}

编辑:更具可读性和工作性(已接受)的代码:

package main

import (
"fmt"
)

type pair struct {
location int
dist int
}

func main() {
var n, m int
fmt.Scanf("%d%d", &n, &m)

if n >= m {
fmt.Println(n - m)
} else {
visited := make([]bool, m+2)

queue := make([]pair, 1)
queue[0] = pair{n, 0}

ans := 0
visited[n] = true
for {
// pop front element
tmp := queue[0]
queue = queue[1:]

// reached destination
if tmp.location == m {
ans = tmp.dist
break
}

// add neighbors to the queue
if tmp.location*2 <= m+1 && visited[tmp.location*2] == false {
queue = append(queue, pair{tmp.location * 2, tmp.dist + 1})
visited[tmp.location*2] = true
}
if tmp.location-1 >= 0 && visited[tmp.location-1] == false {
queue = append(queue, pair{tmp.location - 1, tmp.dist + 1})
visited[tmp.location-1] = true
}
}

fmt.Println(ans)
}
}

最佳答案

你的算法不是BFS,因为,你可以访问不止一个相同的状态。

例如,4 -> 3 -> 6 和 4 -> 8 -> 7 -> 6,其中 6 最终将被处理两次。

其次,对于大于目标的数字x,最小步数总是

x - target + step to reach x

所以你不应该将它添加到队列中。

通过这两个修改,空间复杂度将限制为 O(m),这应该可以帮助您解决问题。

示例代码

ans := -1
dist := make([]int, m + 1)
q := make([]int,1)
q[0] = n

for i := 0; i < len(q); i++ {
node := q[i]
if node == m {
if ans == -1 || ans > dist[m]{
ans = dist[m]
}
break;
}
a := node*2
b := node - 1
if a >= m {
if ans == -1 || ans > (1 + dist[node] + a - m) {
ans = 1 + dist[node] + a - m
}
}else if dist[a] == 0 && a != n {
q = append(q, a)
dist[a] = 1 + dist[node]
}
if dist[b] == 0 && b != n {
q = append(q, b)
dist[b] = 1 + dist[node]
}
}
return ans

关于algorithm - 结构 slice 使用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48681080/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com