【问题标题】:Finding an number in montonically increasing and then decreasing sequencecera在单调递增然后递减的序列中找到一个数字
【发布时间】:2012-07-17 04:17:15
【问题描述】:

在单调增加然后单调减少的序列中找到最大值或最小值可以在 O(log n) 中完成。

但是,如果我想检查一个数字是否存在于这样的序列中,这也可以在 O(log n) 中完成吗?

我认为这是不可能的。考虑这个例子:1 4 5 6 7 10 8 3 2 0。

在这个例子中,如果我需要查找序列是否包含'2',我没有任何条件将搜索空间划分为原始搜索空间的一半。在最坏的情况下,它将是 O(n),因为当我们尝试搜索 2 时,您需要检查两半。

我想知道,如果这个搜索在 O(log n) 时间内完成?

【问题讨论】:

    标签: c algorithm binary-search


    【解决方案1】:

    如您所述,您可以在 O(logn) 中找到最大值(及其位置)。然后你可以在每个部分进行二进制搜索,也是 O(logn)。

    在上面的示例中,您可以在位置 5 找到最大值 10。 然后在子序列 [0..5] (1, 4, 5, 6, 7, 10) 中进行二分查找。 由于没有找到 2,您继续在另一部分 (10, 8, 3, 2, 0) 中进行二分查找。

    求O(logn)中的最大值:看中间的两个元素:7

    【讨论】:

    • 你能否继续上面的例子,在上面的序列中找到2。并在 O(logn) 中得出一个解决方案
    • 嗯...这里的问题是在 O(logn) 中找到最大值。其余的如你所说
    • @AndyStowAway 我认为这很清楚(对于 OP)。编辑了我的答案。
    • 请注意序列是单调的。所以可能有重复。因此,用你的逻辑找到最大值是行不通的。
    【解决方案2】:

    据我所知,对元素依次递增然后递减排序的数组的最佳搜索是斐波那契搜索算法。

    【讨论】:

      【解决方案3】:

      这是python中的草图。简而言之,我们的目标是找到一个与递增和递减区域接壤的元素(我们检查两个条件来检查相邻元素)。我们像标准的二分搜索一样不停地跳跃,直到找到这个元素。希望对您有所帮助。

      def get_max(arr):
          if len(arr) == 1:
               return arr[0]
          if len(arr) in [0,2]:
              return None
          left, right = 0, len(arr) - 1
          while left <= right:
              mid = (left+right) // 2
              #increasing region
              if arr[mid+1] >  arr[mid] and arr[mid] > arr[mid-1]:
                  left = mid + 1
              #decreasing region
              elif arr[mid+1] < arr[mid] and arr[mid] < arr[mid-1]:
                  right = mid - 1
              elif arr[mid+1] < arr[mid] and arr[mid-1] > arr[mid]:
                  return arr[mid-1]
              else:
                  return arr[mid]
          return -1
      

      【讨论】:

        猜你喜欢
        • 2012-10-17
        • 2016-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多