Big o 我的算法最大的优点是什么?

Big o 我的算法最大的优点是什么?,big-o,Big O,我需要帮助找到这个算法的大oh。这是一个搜索算法,它分割并征服大小为n的数组,以找到第一个出现的false,a是数组 n=a.length; i=0; while(a[i]){ i += n/2; n=n/2; } i -= n; while(a[i]) i++; //希望在第一次出现false时停止。如果您正在搜索一个只包含布尔真/假值的数组,那么这些值不能以任何方式排序,这将允许您描述的二进制搜索。如果数组包含一个已排序的值列表,那么就可以使用O(logn)

我需要帮助找到这个算法的大oh。这是一个搜索算法,它分割并征服大小为n的数组,以找到第一个出现的false,a是数组

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

//希望在第一次出现false时停止。

如果您正在搜索一个只包含布尔真/假值的数组,那么这些值不能以任何方式排序,这将允许您描述的二进制搜索。如果数组包含一个已排序的值列表,那么就可以使用O(logn)进行二进制搜索的除法和征服法。要查找第一次出现的false,您需要检查数组的每个值,最坏的情况是O(n)

inti=0;
对于(i;i
第一部分:

n=a.length;
i=0;
while(a[i]){
   i += n/2;
   n=n/2;
}
在O(lgn)中执行: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
,则对于某些k,您处于
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++;
i-=n;
而((i

否则,您的算法可能在O(lg N)和O(N)之间的任何位置,但它可能永远不会终止,或异常终止。

该描述似乎表示二进制搜索,即
O(log N)
。你的代码看起来不是那样的,但是我担心你的代码似乎没有做到它应该做的
i -= n;
while((i < n) && (a[i]))
   i++;