半排序数组中最高值的算法,不能进行完整的二进制搜索?

时间:2017-01-31 22:34:23

标签: arrays algorithm sorting time-complexity

我们获得了一个半分类数组: (1,2,...,n,1,2,...,n-1) 我们知道数组中的最大值将是n,并且为了简单起见,我们知道何时超过它(假设检查该值将打印/写入语句,或者沿着这些行的某些内容)。

2个场景:

  1. 如果我们超过n的索引,我们不允许再次超调(除了最后一次,所以我们知道我们处于最大值)。

  2. 如果我们超过n的索引,我们可以再次超过它,然后我们不再允许超调(除了最后一次因此我们知道我们处于最大值)

  3. 我们希望在最坏的情况下使用最少量的步骤完成此操作(最好计算步数#)。我们希望选项2渐近使用比选项1更少的步骤(最好计算步数)。

    最初,我想到了以下内容:

    1. 从i = 1开始

    2. i = 2i直到超调

    3. 从1 / 2i到2i-1的线性搜索,直到我们达到最大值(我们知道超过1)。

    4. 我认为这将是一个O(logn)算法,但它实际上似乎是O(n)。这是因为它不像二进制搜索,我们能够一直持续到最后,因为我们必须在我们超调时停止。

      现在,我已经考虑过使用指数: 1.从i = 1开始 2. i ^ 2,如果没有超调然后i = i + 1,则继续此步骤直到超调 3.从(i-1)^ 2到(i ^ 2)1的线性搜索,直到我们达到最大值(我们知道超过1)。

      这似乎是O(n ^ 1/2),但是在计算确切的步数时,看起来它实际上仍然是O(n),因为线性搜索对于高可能仍然非常大ñ

      对于第二部分,我考虑使用相同的算法但使用i ^ 3.

      1. 从i = 1开始

      2. i ^ 3,与上述相同

      3. 如果超调,则切换到i ^ 2,与上面相同

      4. ...

        我认为这会给O(n ^ 1/3)。

        多部分问题:

        1. 可以改进这些算法,以便在最坏的情况下执行最少的检查次数吗?

        2. 我是否正确算法复杂度为O(n ^ 1/2)和O(n ^ 1/3)如果是这样,那么步骤的确切步骤是什么,因为它似乎就是那个步骤废墟此

1 个答案:

答案 0 :(得分:0)

n的最佳答案问题很难。但是找到k测试可以完成的最大数量要容易得多。

f(m, k)成为数组的最大大小,您可以在其中找到最多m次超调和最多k次测试的最大值。然后是以下陈述:

  1. f(m, 0) = 1(有1个选项,我知道最大值在哪里)
  2. f(0, k) = k+1(从头开始直到找到它为止......如果你在k尝试失败,那么它是你没看过的最后一个)
  3. f(m+1, k+1) = f(m, k) + 1 + f(m+1, k)(测试f(m, k) + 1'号码,然后根据您是否过冲来做适当的事情。)
  4. 事实证明f(1, k) = k*(k+1)/2。从那里他们变得凌乱。但对于固定的m,您可以显示f(m, k) = km/m! + O(km-1)哪个验证您对O(n1/2)O(n1/3)的猜测。