在小于O(n)比较中找到3个最小元素的时间复杂度

时间:2013-12-10 10:55:34

标签: algorithm big-o time-complexity

我在确定2种算法的时间复杂度方面存在2个问题。

问题1

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

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

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

         
        
    1. 如果 x&lt;最小 1 然后,Min 3 = Min 2 ; Min 2 = Min 1 ;最小 1 = x;
    2.   
    3. 否则,如果最小 1 &lt; x&lt;最小 2 然后,Min 3 = Min 2 ; Min 2 = x;
    4.   
    5. 否则,如果 Min 2 &lt; x&lt;最小 3 然后,最小 3 = x;
    6.   
    7. 否则,如果 Min 3 &lt; x 然后什么都不做
    8.         

      所以,基本上在最坏的情况下需要 3n比较,在最好的情况下需要 0比较

           

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

    问题2

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

    1. 这两个元素可以使用 O(log 100 n)比较来确定。
    2. O(log 100 n)不够,但可以使用 n + O(logn)比较确定它们。< / LI>
    3. n + O(logn)不够,但可以使用3.⌈ n / 2 来确定它们⌉比较。
    4. 3.⌈ n / 2 不够,但可以使用 2确定它们。(n- 1)比较。
    5. 以上都不是。
    6.   

      像以前一样使用类似的参数我得出答案 2(n-1)。虽然我仍然对选项 2 4 感到困惑。

1 个答案:

答案 0 :(得分:3)

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

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