2014-10-06 74 views
0

是否可以通过布尔数组来查找O(logn)运行时间中的假值?数组的索引从0运行到n-1。在O(logn)运行时间中通过数组?

如果是这样,我们将如何在java中做到这一点?伪代码很好。

+1

“是否可能”。不。 – Kevin 2014-10-06 20:10:22

+1

如果它是一个*排序*的布尔数组,可以在O(1):D – user2864740 2014-10-06 20:12:08

+0

@Kevin中找到它是可能的。从数组的开始和结尾读取,直到计数器小于arraySize-counter。 – StackFlowed 2014-10-06 20:13:17

回答

1

不需要。如果没有关于阵列的更多信息,这是不可能的。

您可以做的最好的是O(n),它从左向右遍历数组并检查每个项目。

如果数组排序,则需要两次检查,两端都会有一个错误值,即O(1)

由矛盾的一个常见的证明:

假设算法工作正确。然后,在检查少于所有元素之后,该算法产生正确的答案。现在假设算法只看到true s,它会得出答案x。现在只改变值的算法有而不是检查,我总是可以构造一个算法失败的测试用例。因此,该算法必须检查(未排序)布尔数组的所有元素以确定是否全部为真。

-1

无论你做什么,你都必须检查所有的值,以确保没有错误的价值。线性时间,平均n/2次检查。

+0

这个答案对布尔数组中值的分布做出了假设,它的好处远不止于此。此外,假设自变量的概率为0.5,则必须平均检查少于n/2个元素的方法。 – ThreeFx 2016-10-30 22:23:57

1

通常情况下,答案是“否”:除非您知道有关数组项目的顺序,否则不能通过数组搜索小于O(N)的单个值。

例如,如果数组排序,您可以在O(log N)中找到正确的位置。

对于具有所有false S,如果有的话,在开始boolean阵列被排序装置,以及所有true S,如果有的话,在结束。如果是这种情况,您可以使用二分查找找到对数时间的“分界点”。

+1

Nit:对于二进制排序数组,它只是检查第一个和最后一个元素,或O(1)。 – user2864740 2014-10-06 20:13:27

+0

它是排序。它从0运行到n-1。 – Vimzy 2014-10-06 20:14:02

+0

@Vimzy这些是数组的索引。排序涉及数组中的值。 – 2014-10-06 20:15:37

相关问题