我算法的大O是什么?

时间:2013-04-07 20:41:06

标签: big-o

我需要帮助找到这个算法的大哦。这是一个搜索算法,它正在划分和征服我的大小为n的数组,以找到第一个出现的假,a是一个数组。

n=a.length;
i=0;
while(a[i]){
   i += n/2;
   n=n/2;
}
       i -= n;
while(a[i])
   i++;

//希望,我会在第一次出现错误时停止。

2 个答案:

答案 0 :(得分:1)

第一部分:

n=a.length;
i=0;
while(a[i]){
   i += n/2;
   n=n/2;
}

在O(lg N)中执行:i =(n-n),(n-n / 2),(n-n / 4),...

但它可能有问题。我们假设N = 63。然后:

i = 0   and n = 63, so n/2 is 31.5, and being an integer, it is 31.
i = 31  and n = 31, so n/2 is ... 15
i = 46  and n = 15, so n/2 is ... 7
i = 53  and n = 7, so n/2 ... 3
i = 56  and n = 3, so n/2 ... 1
i = 57  and n = 1, so n/2 = 0

现在,如果a[57]true,则循环将永远不会结束,因为在最终索引中添加n = 0将保持不变。

如果您使用某些非零n退出周期,则某位为n/k,并开始递增i。

i -= n;
while(a[i])
   i++;

这里添加n/k复杂度,在最坏情况下为O(N),在最佳情况下为O(1),但在这两种情况下,只要i超调,您就会访问非法内存数组边界,可能是coredump。你应该做点什么

i -= n;
while((i < n) && (a[i]))
   i++;

否则,您的算法可能介于O(lg N)和O(N)之间,但可能永远不会终止或异常终止。

答案 1 :(得分:0)

如果您正在搜索仅包含布尔值true / false值的数组,则无法以任何允许您所描述的二进制搜索的方式对这些值进行排序。如果数组包含一个排序的值列表,那么您将能够使用O(log n)对二进制搜索进行除法和征服。要查找第一次出现的错误,您需要检查数组的每个值,最坏情况为O(n)。

int i = 0;
for (i; i < a.length; i++) {
    if (a[i] == false){
        break;
    }

}
return i;