Algorithm 在谎言的海洋中寻找真理之岛

Algorithm 在谎言的海洋中寻找真理之岛,algorithm,search,time-complexity,Algorithm,Search,Time Complexity,假设我有一个数组 [False, False, ..., False, True, True, True, ..., True, False, False, ...] 也就是说,一块False,后面跟着一块True,后面跟着另一块False。这些块中的任何一个的大小都可以为零 是否有次线性算法来查找第一个真值的索引(如果存在)?如果不存在真值,这种算法可以返回len(array) 我知道如果没有第二个假块,这可以在O(lgn)时间内完成(基本上只是二进制搜索)。但是我真的不知道如何在网上搜索这

假设我有一个数组

[False, False, ..., False, True, True, True, ..., True, False, False, ...]
也就是说,一块False,后面跟着一块True,后面跟着另一块False。这些块中的任何一个的大小都可以为零

是否有次线性算法来查找第一个真值的索引(如果存在)?如果不存在真值,这种算法可以返回
len(array)

我知道如果没有第二个假块,这可以在O(lgn)时间内完成(基本上只是二进制搜索)。但是我真的不知道如何在网上搜索这个案例,而且我也找不到任何证据表明这样的算法存在,或者不可能存在。

不,最坏的情况必须是O(n)-无论你选择什么顺序来检查数组,有可能内部只有一个真的,它最终可能出现在您查看的最后一个索引中


编辑:事实上,更简单的最坏情况是根本没有真实性。如果不查看数组中的每个元素,就无法确定这一点。

我认为这不是一个准确的参数。如果我在二进制搜索一个整数数组中的数字5,即使只有一个5,并且它在我查看的最后一个索引中,它仍然不需要O(n)时间。但是这种情况是不同的-每次查看一个索引时,可以根据找到的内容丢弃整个数组的左侧或右侧部分。在这种情况下,如果您发现一个false,您不知道自己在哪一边,因此只能放弃单个索引。@SteveD:binary search使用有关数组及其内容的额外带外信息,即数组已排序。在这种情况下,我们没有任何此类信息。@JörgWMittag:我同意我们没有排序信息,但我们确实有关于问题中所述阵列的带外信息。这一论点并不能真正令人信服地证明不存在这样的算法。例如,很容易看出,如果在数组中只找到一个True,那么其余的都可以用比O(n)更好的方法来完成。我现在看到了对这个答案的编辑,它显示了当找到“仅一个True”不起作用时,最坏的情况确实是O(n)+1.如果没有更多的上下文,“假块”是无用的,我们必须假设真/假的随机数组。如果“块”的东西有更多的上下文,告诉我们序列是非随机的,也有关于块大小的信息,它可能被用来优化算法,不可能说使用可用的信息。