我需要提出以下算法:让我们假设我们有一个由零和1组成的数组。数组从数组的开头到索引m用零填充,所有剩余的索引用1填充。我需要在O(logm)时间内找到这个索引m。这就是我的想法:我认为这就像二进制搜索,首先我看一下数组的中间元素,如果是零,那么我会忘记数组的左边部分并对右边部分做同样的事情,继续这样直到我遇到一个。如果中间元素是一个,那么我会忘记右边的部分并对数组的左边部分执行相同的操作。这是一个正确的O(logm)解决方案吗?感谢
答案 0 :(得分: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
。