当前位置: 首页 > 知识库问答 >
问题:

如何计算回溯的空间复杂度?

龙星辰
2023-03-14

对于回溯算法,计算空间(堆栈空间)和时间复杂度的好方法是什么?

我们希望输出组合的长度正好是K,并且sol集必须是唯一的

输入:arr:[1,2,3,4,5]k:4

输出:

[1,2,3,4]//[2,1,3,4]无效,因为它==[1,2,3,4]

// arr == [1,2,3,4,5]
// K   == 4
// backtrack(arr,4,0,{},...other params we don't care)

void backtrack(vector<int> &arr, int K, int start, vector<int> &sol, ...)
{
     if(sol.size() == K)
     {
         //...
     }
     else
     {
           for(int i = start; i < arr.size(); i++)
           {
              sol.push_back(arr[i]);
              backtrack(arr, K, i+1,sol,...);
              sol.pop_back();
           }
     }
}
                   []
      f1()    f2() f3() f4() f()5  
f1.1() f()1.2 ... 

最差的时间复杂度是O(n^k),其中n是数组的长度。

共有1个答案

司马飞鸿
2023-03-14

从技术上讲,时间复杂度不是O(n^k),而是类似于O(sum from i=1 to k bin(n,i))的,因为您不是从arr的开始搜索,而是从解的最后一个元素之后的元素开始搜索,也不像[3]那样切掉无法完成的状态。通常,在这种情况下,时间复杂度是状态数乘以从一个状态到另一个状态所需的平均时间。

 类似资料:
  • 如何计算这些回溯算法的时间复杂度,它们是否具有相同的时间复杂度?如果不一样怎么办?请详细解释并感谢您的帮助。 我实际上有点困惑,对于断字(b),复杂度是O(2n),但对于哈密顿循环,复杂度是不同的,对于打印相同字符串的不同排列,以及对于解决n皇后问题,复杂度是不同的。

  • 我已经通过谷歌和堆栈溢出搜索,但我没有找到一个关于如何计算时间复杂度的清晰而直接的解释。 说代码像下面这样简单: 说一个像下面这样的循环: 这将只执行一次。 时间实际上被计算为而不是声明。

  • null null T(n)=O(1)+O(nlogn)=O(nlogn) 但我不确定。有人能帮帮我吗。

  • 算法的时间与空间复杂度 看到群里们小伙伴在讨论算法复杂度问题,之前在极客时间看了王争的《数据结构与算法之美》,看的我也晕呼呼的,跟上学时在学校老师的讲的有点不一样了,网上搜了下各种各样的,结合参考作一篇简单易懂的总结。 什么是算法 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 如何评价一个算法的好坏 一般我们会从以下维度来评估算法的优劣 正确性

  • 我在计算时间复杂度时遇到困难,尤其是while循环: 示例1: 时间复杂度是O(n x 3 x r)还是O(3)? 示例 2: 时间复杂度会是O(3 x n)还是O(3)?