【问题标题】:Analyzing function runtime complexity分析函数运行时复杂度
【发布时间】:2013-11-01 10:37:54
【问题描述】:

我用 Java 编写了一个函数 append(),我需要通过 O(N) 和 Θ(N) 来分析它的运行时复杂度。

这是原来的问题:

假设append()的运行时复杂度为t = O(N),这意味着t也可以用t = C*N来表示。 (因为C 是一个常数)

因此(t / N) = C

如果,例如t = O(N^2),那么(t / N^2) = C等等。

使用此方法查找append() 运行时复杂度。

所以我为 3 个不同的 Ns 运行了 N 次 append()1,0005,00010,000

long start = System.currentTimeMillis();
for(i = 0; i < N; ++i) {
    append();
}
long end = long start = System.currentTimeMillis();

System.out.println(end - start);

我写下了end-start,它是以毫秒为单位的运行时间。

现在,我如何使用此信息来获得 append() 的时间复杂度?

提前致谢!

【问题讨论】:

  • 你已经有了时间复杂度,这是 O(N) 的事情。你要的是常数,这是对渐近计算复杂性的模糊使用充其量——你为什么要这样做?如果您想比较真实世界的性能,您可以跳过该部分并直接比较测量的时间。这就是所谓的基准测试。

标签: algorithm runtime big-o time-complexity asymptotic-complexity


【解决方案1】:

你误解了方法。 N 应该是字符串的长度,而不是函数调用的次数 应该是

String str(n); // Or whatever how you create a string with n elements

long start = System.currentTimeMillis();
append();
long end = long start = System.currentTimeMillis();

System.out.println(end - start);

然后你运行它几个 Ns,并试图找出它的时间复杂度。尝试除以 t / N,然后除以 t / N^2,直到找到一个恒定的答案。

【讨论】:

    【解决方案2】:

    只有一个数据点,您无法确定函数的时间复杂度。凭经验确定时间复杂度的一个好方法是对多个不同大小的输入的操作进行计时,并查看操作运行时的相对增长率。例如,如果输入大小翻倍时运行时间大致翻倍,则时间复杂度为 O(n)。如果随着输入大小翻倍,运行时间大约翻了两番,那么时间复杂度为 O(n2)。

    您需要多个数据点的原因类似于您需要多个点来确定一条线的原因。仅给定一点,您无法判断斜率或截距是多少。在测量时间复杂度时,不能筛选出常数项和增长项的相对贡献。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2019-03-13
      • 1970-01-01
      • 2022-09-25
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多