[英]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.