Algorithm 为什么记忆中的复杂度是指数级的?

Algorithm 为什么记忆中的复杂度是指数级的?,algorithm,artificial-intelligence,graph,complexity-theory,a-star,Algorithm,Artificial Intelligence,Graph,Complexity Theory,A Star,维基百科在一个*复杂度上说如下(): 问题比时间更大 复杂性是A*的内存使用情况。在里面 最坏的情况,它也必须记住 节点的指数数量 我看不出这是正确的,因为: 假设我们探索节点A,以及后续节点B、C和D。然后我们将B、C和D添加到开放节点列表中,每个节点都带有对A的引用,然后我们将A从开放节点移动到封闭节点 如果在某个时候我们找到另一条通向B的路径(比如说,通过Q),这条路径比通过A的路径好,那么所需要的就是将B对A的引用更改为指向Q,并更新其实际成本g(以及逻辑上的f) 因此,如果我们在一个节

维基百科在一个*复杂度上说如下():

问题比时间更大 复杂性是A*的内存使用情况。在里面 最坏的情况,它也必须记住 节点的指数数量

我看不出这是正确的,因为:

假设我们探索节点A,以及后续节点B、C和D。然后我们将B、C和D添加到开放节点列表中,每个节点都带有对A的引用,然后我们将A从开放节点移动到封闭节点

如果在某个时候我们找到另一条通向B的路径(比如说,通过Q),这条路径比通过A的路径好,那么所需要的就是将B对A的引用更改为指向Q,并更新其实际成本g(以及逻辑上的f)

因此,如果我们在一个节点中存储其名称、引用节点名称及其g、h和f分数,那么存储的最大节点数就是图中的实际节点数,不是吗?我真的不明白为什么算法在任何时候都需要在内存中存储与最佳(最短)路径长度成指数关系的节点数量

有人能解释一下吗



编辑正如我现在读到你的答案时所理解的那样,我是从错误的角度对问题进行推理的。我认为给定的图是理所当然的,而指数复杂性指的是仅由“分支因子”定义的概念图。

我认为指数性在回溯到节点B进行扩展,然后回溯到节点C进行扩展时发挥作用,然后回溯到节点D。现在我们必须跟踪节点A、B、C和D的所有子节点

回溯是基于移动到下一个节点的边的成本,因此这是一种真正的可能性,但更糟糕的情况是

如果每个节点正好有两个子节点,并且每个节点都有相同的代价,那么方程是2^n,其中n是到目前为止的搜索深度


例如,从节点0开始。0有两个子对象00和01。00有两个孩子000和001。在最坏的情况下,如果深度为4,则等式为2^4,其中2是每个节点的子节点数,4是搜索深度。

我不是专家,但我研究了维基百科的文章一段时间,我的解释是这样的(希望我理解得很好:)

比如说,我们有一个4x4节点矩阵。
A、 B、C、D是我们在给定时间可以选择的方向(北、南、东、西)
A*算法开始搜索。

A
队列:B、C、D
AA
队列:B、C、D、AB、AC、AD
AAA-->目标
队列:B、C、D、AB、AC、AD、AAB、AAC、AAD
目标已经达成,但仍有其他的可能性需要考虑。 D
队列:B、C、AB、AC、AD、AAB、AAC、AAD
DC
队列:B、C、AB、AC、AD、AAB、AAC、AAD、DA、DB、DD
DCA
队列:B、C、AB、AC、AD、AAB、AAC、AAD、DA、DB、DD、DCB、DCC、DCD
DCAB-->目标
队列:B、C、AB、AC、AD、AAB、AAC、AAD、DA、DB、DD、DCB、DCC、DCD、DCAA、DCAC、DCAD
等等

如您所见,每执行一步,就会向队列中添加三个以上的节点。
由于A*只遵循非循环路径[1],因此每条路径的最大步骤数为15。
在这种情况下,最大可能路由数为3^15或方向^nodes。
由于每条路线都有15个步骤,因此最坏情况下采取的步骤是15*3^15。
在绝对最坏的情况下,所采取的每一步都是“错误的”。
在这种情况下,在找到答案之前,队列中有3*15*3^15个节点。
因此,在最坏的情况下,需要保留在内存中的节点数量是一个常数,等于可用节点数量的幂。换句话说,内存使用与节点数量成指数关系。


[1] ,幻灯片15

A*只是广度优先搜索的指导版本,它的内存复杂性与解决方案的长度成指数关系

当使用常量启发式时,a*将成为正常的广度优先搜索;统一成本搜索是准确的


当使用最优启发式时,如果忽略启发式计算本身的复杂性,则A*在空间和时间复杂性方面都将
O(n)
。同样
n
是解决方案路径的长度。

回溯只不过是从打开的节点池中选择一个新节点(即f值最低的节点)。你能不能再详细说明一下你是如何看待这会导致指数级内存使用的?也许可以告诉我们基数是多少,指数是多少?还有其他答案支持,要存储的节点数永远不需要大于图中的节点总数。我想你在什么地方把节点和边混淆了。简洁明了,让我立刻明白了我的错误。回答得好。事实上,维基百科上的文本现在读到“在最坏的情况下,扩展的节点数量是解决方案长度的指数(最短路径)”。@ziggystar我正在使用一个*算法,我不确定如何找到算法的运行时复杂性。我有一个带有障碍物的二维网格,我搜索两点之间的最短路径。详情如下。我如何知道A-star的运行时间。谢谢