【问题标题】:Calculating Big O Complexity计算大 O 复杂度
【发布时间】:2014-07-03 05:49:48
【问题描述】:

在最近的一次考试中,我们得到了一个函数来计算在未排序的 ArrayList 中出现了多少双精度(不是原始的 double,而是一个项目出现两次的次数)。

我正确地确定了大 O 复杂度为 O(N^2),但由于我错误地确定了全部复杂度,因此只获得了部分功劳。函数如下:

public static <T> int countDoubles(ArrayList<T> list, int index, Comparator<? super T> cmp) {
    if (index >= list.size())
        return 0;
    int count = 0;
    for (int i = index + 1; i < list.size(); i++) {
        if (cmp.compare(list.get(index), list.get(i)) == 0)
            count++;
    }
    return count + countDoubles(list, index + 1, cmp);
}

在他刚刚发布的考试解决方案中,他给出了这样的解释:

输入集合中有N项,方法调用自己 一遍又一遍地使用产生新索引 N 次的归约步骤 直到它到达基本情况(集合结束)。对于每个 递归框架有一个 for 循环,可以在其中少一个元素上工作 重复每一帧中的集合,直到它到达末尾 集合。所以有 N 个递归调用和 N -1 个步骤 第一次调用,第二次调用 N-2,第三次调用 N-3,依此类推,直到 到达数组的末尾。这种行为在 上限复杂度的术语,因为它将呈现以下 表达式:

T(N) = (N-1) + (N-2) + (N-3) + ... + 1 = N(N-1)/2 = ((N^2)/2) - (N/2) = O(N^2)

为了正确理解这一点,我尝试画出一个大小为 10 的简单数组,每次将其检查的大小减一。

[] [] [] [] [] [] [] [] [] []
   [] [] [] [] [] [] [] [] []
      [] [] [] [] [] [] [] []
         [] [] [] [] [] [] []
            [] [] [] [] [] []
               [] [] [] [] []
                  [] [] [] []
                     [] [] []
                        [] []
                           []

计算递归级别是有意义的N。算出每个元素产生 9 + 8 ... = 45 考虑到 100(N 个递归级别 * N 个元素)是 100,我不明白 N/2 来自哪里,更不用说 ((N^2)/2) - (N/2)

非常感谢任何解释,因为我一直在寻找过去一个月,似乎无法完全掌握我所缺少的东西。谢谢。

【问题讨论】:

标签: algorithm recursion big-o


【解决方案1】:

1M 的整数之和为((M+1) * M) / 2。这只是一个数学事实(通常通过归纳证明)。如果您不相信,请尝试一些示例。

算法的第一遍执行N-1compares,每一级递归执行少一个compare,直到最后一级递归执行1compare。所以比较的总数(对于所有级别的递归)是从1N-1 的整数之和。将公式中的N-1 替换为M,得出的比较总数为(N * (N-1)) / 2

从那里开始,它只是代数

(N * (N-1)) / 2 = (N * N - N) / 2 = ((N^2) / 2) - (N / 2)

以这种方式分解它的原因是因为 big-O 只关心具有最大指数的N。当然,big-O 也不关心常量。所以你扔掉(N / 2),忽略/ 2,答案是O(N^2),这是最大的crock o' ...

好吧,别管我对这件事的看法,就是这样。

【讨论】:

  • 噢噢噢噢。我想我现在明白了很多。我的数学部分是错误的,因为我没有包括 M,即 10。当它应该是 55 时,我在 45 处停了下来。此外,我什至不知道在此使用的等式 ((M+1) * M) / 2总结这些情况(我误解并认为它只是 N^2 的一半,这是完全错误的)。在那之后,代数就完全有意义了!非常感谢!
  • 是的,这个公式在你的编程生涯中至少应该派上用场几次,所以知道它是一件好事:)
猜你喜欢
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 2021-05-13
相关资源
最近更新 更多