【问题标题】:Time complexity of finding 3 smallest elements in less than O(n) comparisons在少于 O(n) 的比较中找到 3 个最小元素的时间复杂度
【发布时间】:2013-12-10 19:29:51
【问题描述】:

关于确定 2 个算法的时间复杂度,我有 2 个问题。

问题 1

使用比较从一组 n 不同 数字中确定最小的 3 个数字。

  1. 这 3 个元素可以使用 O(log2n) 比较来确定。
  2. O(log2n) 是不够的,但是可以使用 n + O(1) 比较来确定它们。
  3. n + O(1) 是不够的,但是可以使用 n + O(logn) 比较来确定它们。
  4. n + O(logn) 是不够的,但是可以使用 O(n) 比较来确定它们。
  5. 以上都不是。

在这里,我想到的方式是取 3 个变量(例如:MIN1, MIN2 & MIN3 where MIN 1 是最小的,而 MIN3 是这 3 个中最大的),用列表的 1st 3 个元素初始化它们并扫描列出一次。对于列表中的每个数字 x,我们有以下 4 种情况:

  1. if x 1then, Min3 = Min2;最小2 = 最小1;最小值1 = x;
  2. else if Min12then, Min3 = Min 2;最小值2 = x;
  3. else if Min23then, Min3 = x ;
  4. else if Min3then,什么都不做

因此,基本上它需要 在最坏情况下进行 3n 次比较,在最佳情况下进行 0 次比较

如果可以以其他更简单(时间限制更短)的方式完成,请纠正我。实际上,我对选项 34 感到困惑。

问题 2

使用比较从一组 n 不同数中确定最小和最大数。

  1. 这两个元素可以使用 O(log100n) 比较来确定。
  2. O(log100n) 是不够的,但是可以使用 n + O(logn) 比较来确定它们。
  3. n + O(logn) 不够,但是可以使用 3.⌈n2 比较。
  4. 3.⌈n2 是不够的,但是可以使用 2.(n-1) 比较。
  5. 以上都不是。

使用与之前类似的论据,我得出了答案 2(n-1)。虽然我仍然对选项 24 感到困惑。

【问题讨论】:

  • 即使不遍历所有元素至少一次,如何获得最小的元素?
  • 对于问题2,如果选项2是候选者,那么选项3当然也是。

标签: algorithm big-o time-complexity


【解决方案1】:

问题 1: 您可以通过首先与 MIN2 进行比较来将您的算法改进为 2n 次比较。这仍然是 O(n)。 要查看 n+O(1) 是不够的,请注意有 n*(n-1)*(n-2) 种可能性,其中 MIN1、MIN2 和 MIN3 位于。 取对数以 2 为底,得到所需比较次数的下限。

问题 2: 这可以在 3*ceil(n/2) 中通过比较两个连续元素来完成,然后将较小的与当前的最小值进行比较,将较大的与当前的最大值进行比较。

【讨论】:

    猜你喜欢
    • 2019-04-07
    • 1970-01-01
    • 2022-03-04
    • 2013-06-12
    • 2015-05-20
    • 2021-11-24
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多