【问题标题】:Time-complexity derivation procedure in generic way for algorithms算法的通用方式的时间复杂度推导过程
【发布时间】:2021-09-19 05:11:37
【问题描述】:

我已经阅读了很多关于数据结构和算法的文章,每个人都只说计算时间复杂度的最通用方法,通常定义为考虑输入变化和迭代数组的执行所花费的时间n个元素让代码如下,Big-O复杂度为O(n)。

 for (int i=0;i<a.length;i++)
   System.out.println(a[i]);

同意这是计算时间复杂度的方法,但是递归算法呢?在计算时间复杂度时如何得出对数表达式和其他东西的结论。到目前为止,我没有遇到或知道用于推导这些复杂性的标准。如果是的话,有人可以给我一些启发或告诉我从哪里开始。

提前致谢。请不要标记为重复,因为可能有很多人在厌倦了网络上的不同教程后面临着同样的理解和时间复杂性问题。

【问题讨论】:

  • 答案是没有简单的答案。这就是为什么你找不到答案。
  • @user3386109- 谢谢,你能详细说明一下吗?
  • 这只是实践和经验的问题。如果您阅读了所有标有time-complexity 的 8533 个问题,那么当您完成时,您会像任何人一样理解它。没有快速简单的答案。这是一个看到某些模式出现在许多不同问题中的问题。例如,1+2+3+...+n 是 O(n^2) 的事实是您经常看到的模式。

标签: algorithm data-structures time-complexity bubble-sort logarithm


【解决方案1】:

不幸的是,没有通用的算法可以让你遵循,给定一段任意代码,可以告诉你它的时间复杂度。这部分是由于 there's no general way to determine whether an arbitrary piece of code will even halt 首先。如果我们可以获取任意一段代码并计算出它的时间复杂度 - 假设它甚至有一个 - 我们可能会使用它来确定它是否会终止,而这不是我们可以做的。

作为一个为什么这很难的例子,考虑这段代码:

int n = /* get user input */
while (n > 1) {
    if (n % 2 == 0) n /= 2;
    else n = 3*n + 1;
}

此代码跟踪从用户编号 n 开始的“冰雹序列”。令人惊讶的是,no one knows whether this process always terminates,所以目前没有人知道这个循环需要多少步才能终止。

在实践中,计算一段代码运行所需的时间需要多种不同的技术。例如,Master Theorem 有助于确定许多递归函数需要多长时间才能终止。对于其他更复杂的递归函数,我们通常可以为运行时写出recurrence relation,然后使用一系列技术来解决这些递归。有时从内而外地工作会很有帮助,用更简单的表达式替换内部循环并查看结果。有时,了解有用的总和很重要,例如 1/1 + 1/2 + 1/3 + ... + 1/n = Θ(log n),或者 20 + 21 + ... + 2k = Θ(2k)。有时,您通过思考代码如何工作以及每个步骤的作用来计算运行时。有时,要计算出一段代码的速度需要数年时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    相关资源
    最近更新 更多