【问题标题】:What is the Big Θ analysis of this function?这个函数的大 Θ 分析是什么?
【发布时间】:2015-06-19 03:37:27
【问题描述】:
public SomeObject secondFunction(SomeObject obj) {

    SomeObject retVal = new SomeObject

    for data in this.dataCollection {
        for data2 in obj.dataCollection {
            if(someCondition) { 
                retVal.add(data) 
            }
        }
    }

    return retVal
}

我正在尝试学习算法分析。什么是大 Θ 分析 这个功能的实现呢?为什么/如何?

我不认为这是一个 n 平方算法,因为循环通过的两个结构可能具有不同的大小。直观地说,我想称它为 n*m 算法,因为 obj、dataCollection 和 this.dataCollection 中的元素数量都是未知数。但我以前从未见过这种措辞,所以它可能是错误的。这是什么?

另外,关于最佳情况、最坏情况和平均情况,我们能说些什么?似乎最好和最坏的情况是相同的,因为它每次都会遍历两个结构中的所有元素。这是正确的,还是错误的?另外,这对平均情况意味着什么?在这个特定示例中,平均情况是否与最佳和最差情况相同?

【问题讨论】:

  • O(N*K) = O(N^2) = Θ(N^2)
  • @Lashane -- 感谢您的评论。为什么/如何是 O(nk)=O(n^2)=Θ(N^2),而 k 可能比 n 大得多或小得多?
  • 想象 N -> 无穷大和 K -> 无穷大,所以 lim(N*K) = N^2
  • @Lashane:不,Θ(N^2) 绝对 与 Θ(N*K) 相同。 Θ(N*K) 的含义有一个精确的数学定义,而 Θ(N*N) 的函数不能满足它。
  • @psmears 不一样,但通常我们只使用 N 来描述 O、Θ 等,所以我们可以假设 N=K=max(N,K) 这就是为什么 Θ( N*K)=Θ(N^2)

标签: algorithm big-o big-theta


【解决方案1】:

您的直觉是正确的 - 将其称为 Θ(n * m) 实现是有效的,假设内部循环的主体花费恒定时间(并且执行实际迭代的时间微不足道)。

至于最佳/最差/平均情况:同样,假设内部循环的主体花费恒定时间,那么在恒定因子内,它们都将是相同的。

【讨论】:

  • 感谢您的评论。几个跟进: (1) 假设 add 函数在将其添加到 retVal 时执行一些排序操作。这是否会排除它在循环体内的恒定时间,因为我们不知道这需要多长时间? (2) 如果内部“if”语句中的条件检查了 retVal 以查看它是否包含该值(并且我们不知道这需要多少步),那么这是否会阻止它在循环中成为常数时间身体? (3) 如果其中任何一个都是,这将如何影响 Big Θ 分析?
  • (1) 这取决于它的排序!如果是对一个固定大小的列表进行排序,那么时间应该是固定的;如果它正在对到目前为止添加的项目进行排序,那么不,您必须将排序所花费的时间考虑到整体复杂性分析中。 (2) 再次,“这取决于”。有些测试可能是恒定的时间;有些可能取决于问题的大小。 (3) 同样,这取决于 - 但通常你必须将这两个操作所花费的时间乘以你的整体复杂性 - 所以如果一个是 Θ(log N),比如说,那么你最终可能会得到 Θ (N*K*log N)
  • 再次感谢 cmets。不过,我还有一个关于 (2) 和 (3) 的最后一个问题。在我正在分析的一种算法中,它会在添加数据之前检查数据是否已添加到 retVal。因此,将 if 语句中的代码“someCondition”替换为“data.equals(data2) && !retVal.contains(data)”,其中 contains 遍历我们一直在构建的数据链表,检查是否出现。这不是恒定的时间,因为我们不知道在任何给定的传递中 retVal 中有多少项目,对吗?如果是这样,那么我的问题是我将如何在数学上表示这一点?
  • 假设列表通常包含 N*K 项,并且各个比较需要恒定时间,它可能是 Θ(N^2*K^2)。
  • 好的,如果列表最终包含 NxK 项,那就有意义了。该列表实际上将包含未知数量的项目。我认为它最多可能只有 N,但它可能只有 0。这是因为它在添加它之前检查值是否在两者中(并且它不会添加重复项。)它通常会有一些东西 -在这些值之间。不过,个别比较确实需要一定的时间。
猜你喜欢
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多