【发布时间】:2014-08-06 10:50:16
【问题描述】:
Given 是一个只包含数字 0 和 1 的无限排序数组。有效地找到过渡点。
例如:00000000000111111111111111
输出:11 是发生转换的索引
我已经为此编写了一个解决方案,忽略了一些边缘情况。
int findTransition(int start)
{
int i;
if(a[start]==1)return start;
for(i=1;;i*=2)
{
//assume that this condition will be true for some index
if(a[start+i]==1)break;
}
if(i==1)return start+1;
return findTransition(start+(i/2));
}
我不太确定这个解决方案的时间复杂度。有人可以帮我解决这个问题吗?
是 O(log(N)) 吗?
【问题讨论】:
-
如果你说你的数组是无限的,那么
N是无限的,所以你的理论复杂度也是无限的。也许你应该将你的问题限制在一个合理/现实的边界...... -
当我自己遇到这个问题时,它就是这样提出的。无限作为一个概念。所以,假设一个非常大的 N。或者,假设 a[start+i]==1 在某个有限 N 处为真。
-
如果过渡永远不会发生,那么复杂度是多少?
-
您可以为此构造一个简单的算法,通过将
i加倍找到pos和1,然后对从pos/2到pos的转换点运行二进制搜索. -
如果只是大,使用二分查找。
标签: arrays performance algorithm data-structures time-complexity