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

我如何计算下面函数的时间复杂度?

唐兴贤
2023-03-14

这里是一个递归函数。它遍历字符串映射(multimap graph )。检查itr->second(s_tmp)如果s_tmp等于所需的字符串(exp),则打印它(itr->first),并再次为该itr->first执行函数。

string findOriginalExp(string Exp){
    cout<<"*****findOriginalExp Function*****"<<endl;
    string str;
    if(graph.empty()){
        str ="map is empty";
    }else{
        for(auto itr=graph.begin();itr!=graph.end();itr++){
        string s_tmp = itr->second;
        string f_tmp = itr->first;
        string nll = "null";
        //s_tmp.compare(Exp) == 0
        if(s_tmp == Exp){
            if(f_tmp.compare(nll) == 0){
            cout<< Exp <<" :is original experience.";
            return Exp;
            }else{
                return findOriginalExp(itr->first);

            }
        }else{
            str="No element is equal to Exp.";
        }
     }

    }
    return str;
    }

停下来没有规则,似乎完全是随机的。这个函数的时间复杂度是如何计算出来的?

共有2个答案

马寒
2023-03-14

您应该使用递归关系来近似递归调用的控制流。我上离散数学的大学类已经有30年了,但一般来说,你确实喜欢伪码,只需要看看有多少个呼叫。在某些情况下,只需计算右手边的最长条件下有多少个是有用的,但通常需要插入一个展开式,并由此导出多项式或幂关系。

冉子石
2023-03-14

我不打算分析你的功能,而是尝试用一种更笼统的方式来回答。似乎您正在寻找一个简单的表达式,如O(n)O(n^2)来解决函数的复杂性。然而,复杂度并不总是那么容易估计。

在您的例子中,它很大程度上取决于graph的内容以及用户作为参数传递的内容。

作为一个类比,考虑以下函数:

int foo(int x){
    if (x == 0) return x;
    if (x == 42) return foo(42);        
    if (x > 0) return foo(x-1);            
    return foo(x/2);
}

在最坏的情况下,它永远不会返回给调用者。如果我们忽略x>=42,那么最坏情况的复杂性是O(n)。单凭这一点对于用户来说并不是那么有用的信息。作为用户,我真正需要知道的是:

  • 不要使用x>=42调用它。
  • O(1)如果x==0
  • O(x)如果x>0
  • O(ln(x))如果x<0

现在试着为您的函数做类似的考虑。最简单的情况是exp不在graph中,在这种情况下没有递归。我几乎可以肯定的是,对于“正确的”输入,您的函数将永远不会返回。找出那些是什么案子并记录下来。在这两者之间,您有在有限的步骤后返回的案例。如果你没有任何线索,如何得到您的手的分析,您可以始终建立一个基准和衡量。正在测量输入大小10501001000的运行时。应足以区分线性、二次和对数依赖关系。

PS:只是一个提示:不要忘记代码实际上应该做什么,以及需要多长时间来解决这个问题(通常更容易以抽象的方式来讨论,而不是深入到代码中)。在上面这个愚蠢的例子中,整个函数可以被其等价的int foo(int){return0;}替换,它显然具有恒定的复杂性,并且不需要比它更复杂。

 类似资料:
  • 如何计算以下函数的时间复杂度? 现在,我知道循环具有O(n)时间复杂度,但在这种情况下,I以更快的速度增长。一次又一次地迭代,我发现,对于每一个第m次迭代,I=m^2。但我仍然不知道如何计算大O。

  • 我在考虑如何正确计算这个函数的时间复杂度: 我假设它是 O(n),其中 n 是列表的长度。我们的 while 循环是 O(n),for 循环也是 O(n), 这意味着我们得到了 2*O(n),等于 O(n)。 我说的对吗?

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

  • 我想用尽可能多的方法解决塔式料斗问题,并计算每种方法的时间复杂性(仅用于自我练习)。解决方案之一是: 我知道递归时间复杂度计算的一般想法,但我在分析注释行(在 for 循环内)时遇到了麻烦。通常我用 )计算时间复杂度,并用一般表达式(例如 T(n-k))降低它,直到我达到基本情况并且可以用 n 表示 k,但是 for 循环的时间复杂度是多少?

  • 有人能指导我找到时间复杂性吗?时间复杂度是否随操作系统而变化?

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