【问题标题】:Difference in Time complexity of Loops循环时间复杂度的差异
【发布时间】:2014-08-08 19:51:08
【问题描述】:

发这个问题的原因comes from here

以下代码片段之间有Time complexity 的区别吗?

代码片段 A:

public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            for (int j = 1; j < 2; j++) {
                if (i < 100)
                    System.out.println("Hi");    
            }    
        }    
    }    

代码片段 B:

public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {    
            if (i < 100)
                System.out.println("Hi");    
        }    
    }

两者之间代码的区别在于Snippet B 不包含来自Snippet A 的内部循环,它没有任何用途,因此被删除。

我的假设:

Snippet A:Snippet B: 对于较大的 n 值都需要 O(n)

space complexity 中可能存在一些差异,因为我们在 Snippet A 中有另一个循环变量 j

观察:

我在VBA 中测试了这个循环结构的类似版本,Snippet BSnippet A 快一点

是因为空间或时间复杂度差异还是两者兼而有之?

【问题讨论】:

  • 在A中你必须做一个B中没有的字符串连接。
  • A 也有一个内部循环。
  • 我实际上没有看到任何“n”。出于时间复杂度的目的,您所指的“n”是外部 for 循环中的 10 吗?
  • 请不要将“执行时间”或“性能”与“时间复杂度”混淆。如果 n 是输入数据项的数量,并且您有一个算法需要大约 0.001 * n 秒才能运行,而另一种算法需要 10 * n i> 秒运行,它们都具有相同的时间复杂度(线性,或 O(n)),但当然慢了一万倍。
  • 并非如此。如果您要在两种完全不同的算法之间做出决定,比如说,一种在 O(n) 中运行,而另一种在 O(n log n i>),那么您可以确定第一个将运行得更快对于足够大的 n。例如,我们使用它来评估排序算法。但在现实生活中,基本算法通常是很早就定下来的,性能是基于“时间复杂度”之外的其他因素。

标签: java performance loops time-complexity


【解决方案1】:

技术上,您的两个示例都在恒定时间内运行。

如果您将第一个 for 循环切换为最多计数 N 或某个变量,那么它们都将在 O(N) 中运行。时间复杂度没有区别,因为它们都是 O(N) 加上一个常数时间操作,结果只有 O(N)。

sn-p A 较慢的原因是仍然存在循环开销(递增和比较 j)。

【讨论】:

  • 你能解释一下你说If you were to switch your first for loop to count up to N or some variable的意思吗?
  • @firephil 两者都没有n。它们都通过循环运行固定次数(10 次)。
  • 由于您的循环始终计数为 10,因此从技术上讲,它以恒定的时间运行。如果您的循环计数到某个变量或函数参数,那么它将是 O(N)。
【解决方案2】:

初始化、比较和递增 j 的开销会减慢 A,但我没有看到内部循环的实际应用。
这肯定会在生产代码中被取消,因为它会降低可读性。

【讨论】:

    猜你喜欢
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2017-04-11
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多