2013-03-10 27 views
2

我需要爲以下內容提出一個算法:讓我們假設我們有一個由0和1組成的數組。該數組從數組的開頭填充到索引m,所有其餘索引都填充了1。我需要在O(logm)時間找到這個索引m。這是我的想法:我認爲這就像二分搜索,首先我看看數組的中間元素,如果它是零,那麼我忘記數組的左側部分,併爲正確的部分做同樣的事情,繼續這樣,直到我遇到一個。如果中間元素是一個,那麼我忘記了正確的部分,併爲陣列的左側部分做同樣的事情。這是一個正確的O(logm)解決方案嗎?由於爲以下提出O(logm)算法

+0

你爲什麼不寫這個僞代碼,然後找出來? – 2013-03-10 13:16:29

+0

實際上,我不確定我的解決方案是O(logm)還是O(logn),其中n是數組的總大小。感謝downvote! – yrazlik 2013-03-10 13:18:54

回答

4

它不是「喜歡」二進制搜索 - 它二進制搜索。不幸的是,它是O(logN),而不是O(logM)

要找到O(logM)的邊界線,請從另一端開始:嘗試位置{1, 2, 4, 8, 16, ... 2^i}依此類推,直到您點擊1。然後對2^i2^(i+1)之間的區間進行二分搜索,其中2^i+1是您發現1的第一個位置。

找到第一個1需要O(logM),因爲索引在每次迭代中都加倍。之後,二分查找需要另一個O(logM),因爲間隔2^i..2^(i+1)的長度也小於M

+0

不應該介於2 ^(i)和2 ^(i-1)之間嗎? – yrazlik 2013-03-10 13:23:44

+0

哦,你說,2 ^我+ 1是第一個位置,我發現了1 – yrazlik 2013-03-10 13:24:13

+0

是的,我認爲這是有效的。謝謝 – yrazlik 2013-03-10 13:31:14