是否可以通过布尔数组在O(logn)运行时间中找到错误值?数组的索引从0到n-1。
如果是,我们如何在java中做到这一点?伪代码很好。
答案 0 :(得分:1)
没有。如果没有关于阵列的任何进一步信息,这是不可能的。
您可以做的最好的事情是O(n)
,它从左到右穿过数组并检查每个项目。
如果对数组进行了排序,则需要进行两次检查,两端都可以使用false值,即O(1)
。
矛盾的常见证据:
假设算法正确。然后,在检查少于所有元素之后,该算法产生正确的答案。现在假设算法只看到true
s,它产生一个答案x。到目前为止,只更改算法未检查的值,我总是可以构造一个算法失败的测试用例。因此,算法必须检查(未排序的)布尔数组的所有元素,以确定是否所有都为真。
答案 1 :(得分:1)
一般来说,答案是" NO":除非你对数组项的顺序有所了解,否则你不能通过数组搜索小于O(N)
的单个值。
例如,如果数组已排序,您可以在O(log N)
中找到正确的位置。
对于要排序的boolean
数组,意味着在开始时包含所有false
s(如果有),在结尾处包含所有true
s(如果有)。如果是这种情况,您可以使用二分查找来找到"分界点"在对数时间。
答案 2 :(得分:-1)
无论您做什么,都必须检查所有值以确保没有错误值。因此线性时间平均为n / 2次检查。