【问题标题】:Time complexity of finding index equal to array (sorted) value查找索引的时间复杂度等于数组(排序)值
【发布时间】:2021-02-24 04:17:21
【问题描述】:

这种递归类似于二分搜索,但我不确定如何使用反向替换来准确解决递归。

要找到它等于数组值的索引(在排序数组中),代码基本上如下所示:

find(array, low, high) {
    if high < low
         return -1

    mid = (low + high) / 2
    midval = array[mid]

    if midval == mid
        return mid

    int left = find(array, low, min - 1)
    if left >= 0
        return left

    int right = find(array, mid + 1, high)
    return right
}

所以递归关系应该是这样的:

T(1) = b

T(n) = 2T(n/2) + c
     = 4T(n/4) + c(1+2)
     = 8T(n/8) + c(1+2+4)
     = 16(n/16) + c(1+2+4+8)

     = 2^k T(n/2^k) + (2^k - 1)c
     = 2^(logn)T(1) + (2^(logn) - 1)c
     = 2^(logn)(1+c) - c

我知道时间复杂度应该是 O(logn) 或 O(nlogn),但我不知道如何使用反向替代来实现。

【问题讨论】:

    标签: arrays algorithm time-complexity


    【解决方案1】:

    用一个排序数组找到一个简单实现的元素,最坏的情况是O(n)。因此,更好的方法将具有低于O(n) 的最坏情况复杂度,因此它不可能是O(n logn)

    在典型的二分查找中,可以利用被排序的数组,因此不需要在两个子树中搜索每个递归调用。一个在阵列上向左或向右。所以不是T(n) = 2T(n/2) + c,而是T(n) = T(n/2) + c

    现在您的问题与二分查找不同,因为您想在数组中找到与其索引值匹配的位置。因此,与这种情况下的二分搜索不同,在某些递归调用中,您可能必须同时进行左右搜索。

    所以在你的情况下,最坏的情况实际上是O(N),因为2^(log2N)N,正如你所看到的here。除非有一种非常聪明的方法可以改进您的代码,否则对于O(N) 的最坏情况,我只会使用普通搜索、更简单、更易读的代码。

    如果值 x 与返回该值的索引匹配,则从数组的开头进行搜索。否则,如果x &gt; the current index,你可以跳转到下一个索引等于值xie,array[x]),因此你跳过基于数组是事实的数组位置sorted 将没有与其值匹配的索引。

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 1970-01-01
      • 2014-10-12
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 2020-10-27
      相关资源
      最近更新 更多