微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有人可以评估此​​功能的时间复杂度

如何解决有人可以评估此​​功能的时间复杂度

function    (n)
input : an  integer n
r ← 0
for i = 1 to n  //runs n times
    for j = i   + 1 to n     // runs n^2 times
           for k = i + j − 1 to n   //runs n^3 times
                r ← r + 1
return r

我的回答是O(n ^ 3),但是当我尝试使用sigma表示法找到它时,它总是以O(n ^ 2)结尾。

原始问题:

以下算法返回什么值?它的基本操作是什么?怎么
基本操作执行了多少次?给出最坏情况下的运行时间
Big Oh表示法的算法。

解决方法

tldr:该算法位于O(n^3)中。


为什么?

计算执行r <- r + 1的频率。

如果有帮助,请以某种语言实施并执行,以使它感觉更好。例如,在Java中:

int n = 10;

int r = 0;
for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j++) {
        for (int k = i + j - 1; k <= n; k++) {
            r++;
        }
    }
}

简介

外部循环正确生成n个迭代。然后,第二个循环将生成n - 1,n - 2,n - 3,n - 4,...个世代。

最里面的循环取决于ijn

例如,修复i = 1,然后让jn - 1运行到1。您将获得k 1 + (n - 1)n,这根本没有运行。然后运行1 + (n - 2)的{​​{1}}至n,最多运行2

因此,使用n,您将获得i = 1。然后k = 2,3,4,...,n,您得到i = 2。重复并求和,直到k = 4,n + (n + 1)总共只产生i = n

k = (n+(n-2))

对于带有i = 1 -> k = 2,5,6,n i = 2 -> k = 4,n,(n+1) i = 3 -> k = 6,(n+1),(n+2) . . . i = n -> k = (n+(n-2)) 的示例,它是:

n = 10

2,7,8,9,10 4,10,11 6,11,12 8,12,13 10,13,14 12,14,15 14,15,16 16,17 18


k的值

现在请注意,循环只会执行到k为止。因此,您可以舍弃高于k <= n的{​​{1}}的所有值,并计算剩余值的迭代次数。

k

总跑步次数

因此,每个参数都是n的值,它将产生2,10| 4,10|,13 10|,14 | 12,15 | 14,16 | 16,17 | 18 多次运行。这样做,您会得到:

k

对这些求和求和,您最终获得了总运行次数:

(n + 1) - k

哪个产生9,2,1 7,1 5,1 3,1 1


公式和证明

确切的公式是:

9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1
      + 7 + 6 + 5 + 4 + 3 + 2 + 1
              + 5 + 4 + 3 + 2 + 1
                      + 3 + 2 + 1
                              + 1

如果您放下r = 95(不会影响复杂性),则可以简化为

sum_{i = 1}^{n - 1} ceil((n - i) / 2) * i

现在您可以轻松地看到并证明它在ceil中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。