簡體   English   中英

查找等於數組(已排序)值的索引的時間復雜度

[英]Time complexity of finding index equal to array (sorted) value

這種遞歸類似於二進制搜索,但我不確定如何使用反向替換來准確解決遞歸問題。

要找到等於數組值的索引(在排序數組中),代碼基本上如下所示:

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),但我不確定如何使用反向替換從這里到達那里。

使用排序數組查找具有天真的實現的元素最壞情況下為O(n) 因此,更好的方法的最壞情況復雜度低於O(n) ,因此它不可能是O(n logn)

在典型的二分搜索中,一個人利用正在排序的數組,因此不需要為每個遞歸調用在兩個子樹中搜索。 一個在陣列上向左或向右移動。 因此,不是T(n) = 2T(n/2) + c T(n) = T(n/2) + c

現在您的問題與二分查找不同,因為您希望在一個與其索引值匹配的數組中找到一個 position。 因此,與此上下文中的二分查找不同,在某些遞歸調用中,您可能還需要左右 go。

所以在你的情況下,最壞的情況實際上是O(N) ,因為2^(log2N)N正如你在這里看到的那樣。 除非有一種超級聰明的方法來改進您的代碼,否則我只會將 go 用於正常搜索,對於O(N)的最壞情況,代碼也將更簡單且更具可讀性。

如果值x與返回該值的索引匹配,則從數組的開頭進行搜索。 否則,如果x > the current index ,您可以跳轉到下一個等於值x的索引(array[x] ),因此您跳過數組 position,基於該數組已排序將沒有索引匹配它的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM