我正在尝试理解动态编程,我发现了一个有趣的问题:“给定一个nxn正方形的棋盘和一个起始位置(xs,ys),找到最短的(如移动的数量)路径骑士可以走到终点(xe,ye)“。这就是我的解决方案听起来像:
Initialize the matrix representing the chess board (except the "square" xs,ys) with infinity.
The first value in a queue is the square xs,ys.
while(the queue is not empty){
all the squares available from the first square of the queue (respecting the rules of chess) get "refreshed"
if (i modified the distance value for a "square")
add the recently modified square to the queue
}
有人可以帮我找出这个功能的计算时间O值是多少?我(有点)理解big-O,但我不能为这个特定的函数赋值。
答案 0 :(得分:1)
因为您正在使用队列,所以处理方块的顺序将按最小距离的顺序排列。这意味着您只需修改一个正方形的距离值,因此时间将为O(n ^ 2),因为有n ^ 2个正方形。
答案 1 :(得分:1)
您的算法措辞不佳
您没有定义“队列”的内容
你没有定义“刷新”
你总是卡在第一个广场上,你没有跟踪当前的广场。
也是,谷歌Djkistra的算法不,不要做dijkstra的算法。你没有加权图。
如果你想使用动态编程算法来强制你的答案,我会从(xe,ye)开始,你应该能够在nxn网格上得到O(n ^ 2)< / p>
但是如果你考虑你的约束(你的棋子像骑士一样移动,并且他沿着网格移动,而不是任意图形)你应该能够在O(n)时间内完成这个问题
答案 2 :(得分:0)
听起来有点像Dijkstra的最短路径算法。在这种情况下它是O(N ^ 2),你找到从源到目的地的所有可能路径的“距离”,以确定最低路径。
答案 3 :(得分:0)
在我看来,这是广泛的第一次搜索。很明显,您在队列中最多添加一个正方形,并且队列条目的处理是O(1),因此总复杂度受O(N ^ 2)的限制。但是,如果你可以证明一个定理,告诉NxN国际象棋棋盘上从位置A到B的移动次数小于N(直观地说,这对N等于或大于8来说是合理的),那么你的算法将是O(N)。