我希望这是一个简单的问题,但谷歌没有立即给我任何结果。
如果我有一个运行时间为O(n log n)的函数,并且该函数内部是另一个函数,也取O(n log n),那么该函数的总运行时间是多少?
说我有一份清单。
找到所需的列表需要n log n时间,然后再次n log n时间在该列表中找到所需的项目。
类似
find list in n log n time
find element in list in n log n time
运行时间是否只是n log n?
提前谢谢。
如果函数如下所示:
for each element e1 in list // (O(N) time)
if e1 is the one we are looking for
for each element e2 in e1 // (O(N) time)
do something
O(N)中的O(N),但第二个O(N)仅在第一个循环中执行一次。
答案 0 :(得分:2)
这取决于您调用第二个函数的频率。
如果执行在O(n log n)时间内在列表列表中查找列表的函数 然后在只搜索一个列表中搜索所需的元素,它在O(m log m)时间内找到, 那么总的运行时间是O(n log n + m log m) 如果m = n则总时间仅为O(n log n)。
如果外循环执行O(n log n)“步骤”,并且在每一步中您考虑列表列表中的一个列表并调用一个函数,该函数需要O(m log m)时间才能找到所需的项目该列表,则总运行时间为O(mn(log m)(log n))。但是,我很难想象应用程序会使用这样的算法。
如果执行循环O(N)次,并且在循环迭代的最多一次期间执行一个在O(M)时间内运行的“内部”循环,那么外环的总运行时间为O(N + M)。请注意,我们说O(M + N)的原因是我们没有 本段中关于哪个增长更快,M或N和O(M + N)的任何其他信息 在任何一种情况下都包括我同样,如果我们知道M = N,或者即使我们只知道M是O(N)(增长速度不比N快),那么我们就可以将总时间写为O(N)。
答案 1 :(得分:0)
你的符号模糊了事实,没有“另一个人的功能”。 (更准确地说,没有任何函数可以调用另一个几次。)
实际做的是
find list in n log n time;
find element in list in n log n time
具有n阶n的复杂性。
在第二个例子中:
for each element e1 in list // (O(N) time)
if e1 is the one we are looking for
break // Found
for each element e2 in e1 // (O(N) time)
do something
总计O(N)。
这与真正的嵌套形成鲜明对比:
for each element e1 in list // (O(N) passes)
for each element e2 in e1 // (O(N) time)
do something
总计O(N²)。
答案 2 :(得分:0)
有关
find list in n log n time
find element in list in n log n time
我们得到了
Time = n log n * n log n = 2 n log n ~ O(n log n)
而
for each element e1 in list // (O(N) time)
if e1 is the one we are looking for
for each element e2 in e1 // (O(N) time)
do something
我们得到了
Time = n + k n = (k+1) n
Best-Case: only 1 matching value exist
Time(Best-Case) = n + 1 * n = 2n ~ n
Worst-Case: all values are identical and matching
Time(Worst-Case) = n + n * n = n + n^2 ~ n^2
答案 3 :(得分:-1)
嗯,从数学角度讲,你只是将“内部的东西”乘以大的Os。得到O(n² log²(n))
。