2011-03-28 46 views
1

可能重複:
Interview question - Search in sorted array X for index i such that X[i] = i找到一個索引i,使得[I] = I

您與整數的排序後的數組和數組的長度給出。現在你必須找到一個索引i,例如a(i)=i。 如果索引被給出,我可以在o(logn)中完成,但是如果索引i沒有被提及,怎麼辦?

+14

如果我給出,我可以在恆定時間:) – 2011-03-28 12:53:46

+0

我已經使用修改的二進制搜索,你的解決方案... – 2011-03-28 12:54:34

+1

@prp你是如何對O(log n)時間的數組進行排序的? – 2011-03-28 12:55:30

回答

7

正如亞歷山大在評論中指出的,該指數的預知意味着它是O(1),而不是O(log N)

而且,除非有一些你不告訴我們的信息,你需要O(n)的時間來做到這一點沒有這種先見之明:

for x = 0 to len(a) - 1: 
    if a[x] = x: 
     return x 

澄清:原來的問題沒有說明該名單排序,這是後來添加。由於這使問題成爲this one的重複,因此您應該查看解決方案的答案。

這個答案將保留原樣,因爲沒有重複其他人的意思,並且它與未排序的情況相關。

+0

@paxdiablo你的意思是說,如果索引我沒有給出,我們將在o(n)中做它,我是正確的.. – 2011-03-28 12:58:28

+2

大概額外的信息是數組排序。 – 2011-03-28 12:58:57

+0

@prp,是的。我回答「如果我沒有提到索引」位。其他人已經表明,如果你已經有了索引,那麼它就是O(1)。 – paxdiablo 2011-03-28 13:01:29

1

根據給出的信息,您需要檢查值直到找到匹配項。最壞的情況(不匹配,或匹配在最後一個單元格中找到)是O(n)。 如果數組已經排序,則可以執行二進制搜索,即O(log n)。

您的聲明要麼是錯誤的,要麼是您遺漏了一些信息。

+0

-1:你不能做一個標準的二分查找來解決這個問題。 – GrahamS 2011-03-28 13:16:51

+0

正確,您不能按原樣在陣列上使用bsearch()。如果您想保留解決方案的O(log n)屬性,則必須強制執行自己的二進制搜索。如果您修改陣列(就地或複製)並從[i]中減去i,則可以使用bsearch()。這樣做的複雜性是O(n)。 – 2011-03-28 14:15:51

相關問題