嵌套时间复杂度

时间:2014-06-02 18:00:09

标签: performance algorithm time-complexity

我希望这是一个简单的问题,但谷歌没有立即给我任何结果。

如果我有一个运行时间为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)仅在第一个循环中执行一次。

4 个答案:

答案 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))