【问题标题】:how to understand time complexity from a plot?如何从情节中理解时间复杂度?
【发布时间】:2016-11-23 19:43:27
【问题描述】:

我用 C 语言编写了一个程序,我在其中分配内存来存储维度矩阵 n-by-n,然后提供一个线性代数子例程。我在理解如何从图中识别这些操作的时间复杂度方面遇到了很大的麻烦。特别是,我有兴趣确定 CPU 时间如何作为 n 的函数进行缩放,其中 n 是我的大小。

为此,我创建了一个 n = 2、4、8、...、512 的数组,并计算了这两个操作的 CPU 时间。我对每个 n 重复此过程 10000 次,最终取平均值。因此,我想出了第二个数组,可以与我的 n 数组匹配。

有人建议我打印双对数图,我读到 herehere 使用这种方式,“幂显示为一条直线” (@987654323 @)。这是结果图(dgesv 是我使用的线性代数子程序)。

现在,我猜我的时间复杂度是 O(log n),因为我的两个操作都得到了直线(我确实考虑到红线)。我看到了线性复杂度、对数复杂度等之间的形状差异。但我仍然怀疑是否应该说一下 dgesv 的时间复杂度。我确信有一种我根本不知道的方法,所以如果有人可以帮助我了解如何正确看待这个情节,我会很高兴。

PS:如果有特定的社区可以在哪里发布此问题,请告诉我,以便我可以移动它以避免在这里造成更多混乱。谢谢大家。

【问题讨论】:

    标签: plot time-complexity big-o


    【解决方案1】:

    以黄线为例,它似乎从 (0.9, -2.6) 变为 (2.7, 1.6),其斜率大致等于 2.5。当您绘制 log(t) 与 log(n) 时,这意味着:

    log(t) = 2.5 log(n) + c
    

    或者,两边取幂:

    t = exp(2.5 log(n) + c) = c' n^2.5
    

    2.5 的力量可能被低估了,因为您的 dsegv 可能是 has a cost 的 2/3 n^3(尽管 O(n^2.5) 是 theoretically possible)。

    【讨论】:

    • 这真的很有帮助,谢谢!请问c代表什么?
    • 某个常数(您可以将其计算为 c = -2.6 - 2.5 * .9,然后 c' = e^c,但这取决于对数底数和您选择的单位比例) .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多