为以下提出O(logm)算法

时间:2013-03-10 13:15:10

标签: algorithm big-o

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

1 个答案:

答案 0 :(得分: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