Artificial intelligence 我们如何确定minmax的时间和空间复杂性?

Artificial intelligence 我们如何确定minmax的时间和空间复杂性?,artificial-intelligence,big-o,complexity-theory,minimax,Artificial Intelligence,Big O,Complexity Theory,Minimax,我在确定空间和时间的复杂性时遇到了一些困难。例如,如果我有一棵树,它有一个分支因子b,并且最多有一个深度d,我如何计算时间和空间的复杂性?我知道它们是O(b^d)和O(bd),但我的问题是如何获得这些值。空间复杂性相当于“我需要为这个算法分配多少内存”。 时间复杂性相当于“执行(抽象意义上)需要多长时间” 具有分支因子b和深度d的树将在其第0级有一个节点,在其第一级有b节点,在其第二级有b*b=b^2节点,在其第三级有b^2*b=b^3节点,等等。在这四个级别(深度3)中,它有1+b+b^2+b

我在确定空间和时间的复杂性时遇到了一些困难。例如,如果我有一棵树,它有一个分支因子b,并且最多有一个深度d,我如何计算时间和空间的复杂性?我知道它们是O(b^d)和O(bd),但我的问题是如何获得这些值。

空间复杂性相当于“我需要为这个算法分配多少内存”。 时间复杂性相当于“执行(抽象意义上)需要多长时间”

具有分支因子b和深度d的树将在其第0级有一个节点,在其第一级有b节点,在其第二级有b*b=b^2节点,在其第三级有b^2*b=b^3节点,等等。在这四个级别(深度3)中,它有1+b+b^2+b^3。就复杂度而言,我们通常只保留最高阶项,并删除任何乘法常数。因此,对于空间复杂度,最终的复杂度为O(b^d)

现在在时间复杂性方面,计算的不是节点的数量,而是算法完成所需的循环或递归调用的数量(最坏情况)

我要冒险出去,假设你说的是IDDF。关于O(b^d)和O(bd)从何而来的解释在维基文章中有很好的解释。

Time 树中的所有节点都必须在某个点生成一次,并且假设生成节点需要一个固定的时间
c
(固定的时间可以变化,您可以选择
c
作为生成任何节点的最高固定时间)。顺序由算法决定,并确保节点不必重复扩展

nodes          b=2                        b=3
b^0             *                          *
              /   \               /        |        \
b^1          *     *             *         *         *
            / \   / \         /  |  \   /  |  \   /  |  \
b^2        *   * *   *       *   *   * *   *   * *   *   * 
               ...                        ...
正如您在图中所看到的,计算第一级的成本是
c*b^0
成本-准确地说是
c
。树中的下一级将包含
b^1
节点,生成第二级需要花费
c*b^1=c*b
。对于第三级,第二级中的每个节点都将有
b
节点,这意味着
b*b^1=b^2$
节点和
c*b^2
成本

在深度
d
的树的最深层,将有
b^d
节点,该层的工作是
c*b^d
。到目前为止,完成的总工作量为
c*b^0+c*b^1+…+c*b^d
。对于复杂性,我们只看上升速度最快的项,然后去掉常数,得到:

O(c+c*b+…+c*b^d)=O(c*b^d)=O(b^d)

本质上:时间是一个函数
f(d)=和(i=1..d){c*b^i}
,和
O(f(d))=O(b^d)

空间 该图显示了
b=3
在不同阶段的算法<代码>*表示当前已扩展的节点,
表示未知节点,
+
表示已完全计算其分数的节点

                    branching factor b = 3                     space
         *             *             *             *             b
       / | \         / | \         / | \         / | \         
      *  ?  ?       *  ?  ?       +  *  ?       +  +  *          b
    / | \         / | \            / | \            / | \      
   *  ?  ?       +  +  *          +  *  ?          +  +  *       b
 / | \               / | \         / | \               / | \   
*  ?  ?             +  *  ?       +  *  ?             +  +  *    b
为了计算节点的分数,您可以展开节点,选择一个子节点并递归展开,直到到达深度
d
处的叶节点。一旦一个子节点完全计算完毕,就可以转到下一个子节点。计算完所有
b
子节点后,将根据子节点计算父节点得分,此时可以从存储中删除子节点。上图说明了这一点,其中在4个不同阶段显示了算法


在任何时候,您都可以扩展一条路径,并且需要
c*b
存储来存储各级的所有子节点。这里再次假设每个节点需要恒定的空间量。关键是任何子树都可以通过其根进行总结。由于路径的最大长度是
d
,因此您将最大限度地需要
c*b*d
空间。如上所述,我们可以去掉常数项,得到
O(c*b*d)=O(b*d)

他在问关于计算minimax的时间和空间复杂度的问题。O(b^d)是时间复杂度,空间复杂度是O(bd)。所以这个答案没有多大价值。@danben啊,是的,我错过了那个标签。我以为空间竞争是O(d)?极大极小时间和空间复杂度不是和深度优先搜索一样吗?渐近复杂度不是值。它们是公式。如果你想要精确的价值,你应该谈论时间和空间成本。然后下一个问题,至少是时间成本,将是“做什么的时间?”访问树中的每个元素?找到从根到叶的路径,其中节点的和最小?把树变成某种正常的形状?只有操作具有时间成本和复杂性。数据结构就在那里。