我需要爲以下內容提出一個算法:讓我們假設我們有一個由0和1組成的數組。該數組從數組的開頭填充到索引m,所有其餘索引都填充了1。我需要在O(logm)時間找到這個索引m。這是我的想法:我認爲這就像二分搜索,首先我看看數組的中間元素,如果它是零,那麼我忘記數組的左側部分,併爲正確的部分做同樣的事情,繼續這樣,直到我遇到一個。如果中間元素是一個,那麼我忘記了正確的部分,併爲陣列的左側部分做同樣的事情。這是一個正確的O(logm)解決方案嗎?由於爲以下提出O(logm)算法
2
A
回答
4
它不是「喜歡」二進制搜索 - 它是二進制搜索。不幸的是,它是O(logN)
,而不是O(logM)
。
要找到O(logM)
的邊界線,請從另一端開始:嘗試位置{1, 2, 4, 8, 16, ... 2^i}
依此類推,直到您點擊1
。然後對2^i
和2^(i+1)
之間的區間進行二分搜索,其中2^i+1
是您發現1
的第一個位置。
找到第一個1
需要O(logM)
,因爲索引在每次迭代中都加倍。之後,二分查找需要另一個O(logM)
,因爲間隔2^i..2^(i+1)
的長度也小於M
。
相關問題
- 1. 提高爲O(n^2)算法
- 2. 有人可以解釋爲什麼以下LIS算法不是O(n)?
- 3. Big-O算法
- 4. Logm未定義
- 5. 想出一種算法,O(n)的
- 6. heapify O(n)算法
- 7. 確認爲O Dijkstras算法(V + E)
- 8. 爲什麼這個算法O(N)?
- 9. 優化算法(N^3)爲O(n^2)
- 10. 算法分析(big-O)算法
- 11. 爲什麼resharper提出以下建議?
- 12. 如何爲以下輸入/輸出實施Back Propagation算法?
- 13. 提出多項式算法
- 14. 遞增算法 - O(tlgn)
- 15. O符號,決鬥算法
- 16. Big-O算法分析
- 17. 大O符號算法
- 18. 算法的大O符號
- 19. 大O算法分析
- 20. 算法的大O分析?
- 21. 未知算法的大O
- 22. 如何計算動態規劃(Memoization)算法的大O O
- 23. 計算算法使用大O
- 24. 貪婪算法以下
- 25. 需要一些提示或幫助出來的算法打印以下
- 26. 如何計算大O符號以下代碼
- 27. 一個算法的大O表示法
- 28. 爲什麼我的O(NLogN)算法找到字符比我的O(N)算法運行得更快?
- 29. 以下方法的運行時間如何爲O(N)和空間複雜度爲O(1)?
- 30. 提高以下組合算法的性能
你爲什麼不寫這個僞代碼,然後找出來? – 2013-03-10 13:16:29
實際上,我不確定我的解決方案是O(logm)還是O(logn),其中n是數組的總大小。感謝downvote! – yrazlik 2013-03-10 13:18:54