【问题标题】:How to get asymptotic running time?如何获得渐近运行时间?
【发布时间】:2016-10-19 22:48:12
【问题描述】:

我不知道如何获得确切的渐近复杂度,因为以下问题要求我解决。

这是一个问题:

我从课堂上学到的一切是,如果存在运行 N 次的“for 循环”,或者递归调用 N 次“递归方法”,那么任何一个都是 O(N)。这几乎是我所知道的所有基础知识。

问题 1)关于“N(N+1)/2”的答案是什么,这与“O(N(N+1)/2)”相同吗?

另外,答案是“在迭代 i 时,add 和 trimToSize 都要求将 i 数组元素复制到新数组中。”,我认为它是这样说的,因为它同时调用了“list.add()”和“ list.trimToSize()" N 次。

从我的角度来看,这看起来更像是 O(N)... 因为它使用“list.add()”将第 i 个元素添加 N 次,并且通过“list.trimToSize()”将元素数组复制 N 次”。因此,N + N

问题 2)我只是不知道如何获得答案所说的 N(N+1)/2。

如能回答,万分感谢!

【问题讨论】:

    标签: java algorithm performance asymptotic-complexity cumulative-sum


    【解决方案1】:

    从我的角度来看,这看起来更像是 O(N)... 因为它使用“list.add()”将第 i 个元素添加 N 次,并且通过“list.trimToSize()”将元素数组复制 N 次”。因此,N + N

    但是,我的回答是错误的。

    是的。是的。

    您将每次调用trimToSize 处理为具有恒定成本。这是不正确的。如果你看看trimToSize 做了什么,你会发现每次调用 都将所有元素(到目前为止)复制到一个新数组中。这不是固定成本

    • 在第一次调用 trimToSize 时,数组长度为 1,因此您复制了 1 个元素。
    • 在第二次调用 trimToSize 时,数组长度为 2,因此您复制了 2 个元素。
    • ...
    • 在对trimToSize 的第 N 次调用中,数组长度为 N,因此您复制了 N 个元素。

    将所有这些加起来,所有trimToSize 调用都会得到N(N+1)/2

    (事实上,鉴于代码使用ArrayList 的方式,每次调用add 时,都需要重新分配列表的后备数组。所以同样的计算也适用于那里。)


    请注意,O(N(N+1)/2)O(N^2) 的复杂度等级相同。你可以从第一原理证明这一点。)

    【讨论】:

    • 啊,我知道了,非常感谢!所以运行“list.add()”N次的O(N),以及“list.trimToSize()”方法的O(N(N+1)/2)运行时间。因此,总共添加它们,“N + N(N+1)/2”。但是你说 O(N(N+1)/2) 可以是 O(N^2).. 所以它可以被替换为“N + N^2”。从中计算大哦,“N + N^2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2021-01-28
    相关资源
    最近更新 更多