这里是一个递归函数。它遍历字符串映射(multimap
)。检查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;
}
停下来没有规则,似乎完全是随机的。这个函数的时间复杂度是如何计算出来的?
您应该使用递归关系来近似递归调用的控制流。我上离散数学的大学类已经有30年了,但一般来说,你确实喜欢伪码,只需要看看有多少个呼叫。在某些情况下,只需计算右手边的最长条件下有多少个是有用的,但通常需要插入一个展开式,并由此导出多项式或幂关系。
我不打算分析你的功能,而是尝试用一种更笼统的方式来回答。似乎您正在寻找一个简单的表达式,如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
中,在这种情况下没有递归。我几乎可以肯定的是,对于“正确的”输入,您的函数将永远不会返回。找出那些是什么案子并记录下来。在这两者之间,您有在有限的步骤后返回的案例。如果你没有任何线索,如何得到您的手的分析,您可以始终建立一个基准和衡量。正在测量输入大小10
、50
、100
、1000
的运行时。应足以区分线性、二次和对数依赖关系。
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皇后问题,复杂度是不同的。