回答
不需要。如果没有关于阵列的更多信息,这是不可能的。
您可以做的最好的是O(n)
,它从左向右遍历数组并检查每个项目。
如果数组排序,则需要两次检查,两端都会有一个错误值,即O(1)
。
由矛盾的一个常见的证明:
假设算法工作正确。然后,在检查少于所有元素之后,该算法产生正确的答案。现在假设算法只看到true
s,它会得出答案x。现在只改变值的算法有而不是检查,我总是可以构造一个算法失败的测试用例。因此,该算法必须检查(未排序)布尔数组的所有元素以确定是否全部为真。
无论你做什么,你都必须检查所有的值,以确保没有错误的价值。线性时间,平均n/2次检查。
这个答案对布尔数组中值的分布做出了假设,它的好处远不止于此。此外,假设自变量的概率为0.5,则必须平均检查少于n/2个元素的方法。 – ThreeFx 2016-10-30 22:23:57
通常情况下,答案是“否”:除非您知道有关数组项目的顺序,否则不能通过数组搜索小于O(N)
的单个值。
例如,如果数组排序,您可以在O(log N)
中找到正确的位置。
对于具有所有false
S,如果有的话,在开始boolean
阵列被排序装置,以及所有true
S,如果有的话,在结束。如果是这种情况,您可以使用二分查找找到对数时间的“分界点”。
Nit:对于二进制排序数组,它只是检查第一个和最后一个元素,或O(1)。 – user2864740 2014-10-06 20:13:27
它是排序。它从0运行到n-1。 – Vimzy 2014-10-06 20:14:02
@Vimzy这些是数组的索引。排序涉及数组中的值。 – 2014-10-06 20:15:37
- 1. 时间复杂度:O(logN)或O(N)?
- 2. O(logn)时间和算法关系
- 3. O(logn)^ 2时间表现的示例
- 4. 是O(LogN)== O(3LogN)?
- 5. 在O(logn)时间使用STL堆执行减少键
- 6. 查找第n个fib数,在O(logn)
- 7. 通过JNI运行时间
- 8. 如何在O(logn)时间查找5个排序列表的中位数?
- 9. 查找O(nlogn)和O(logn)附加空间中的最小正数
- 10. BIg O符号:n * logn
- 11. 如何删除在ArrayList中重复的元素在O(LOGN)时间
- 12. 3Sum算法版本O(N^2 logn)时间
- 13. 在Elixir中进行二元搜索O(logN)?
- 14. O(n)的运行时间算法
- 15. 分析运行时间,大O
- 16. 计算大O运行时间
- 17. 查找RBTREE在O(LOGN)的算法
- 18. 通过Python运行一个长时间的运行过程Popen
- 19. 从小于O(log(n))运行时间的排序数组中搜索
- 20. setInterval只在运行通过querySelectorAll数组循环的函数时运行一次
- 21. 通过类型参数在运行时
- 22. 使用NSpredicate过滤NSArray的Big-O运行时间
- 23. Ideal跳过列表? O(n)运行时间?
- 24. AVL Tree:在O(logn)时间内的两个值之间的键中查找具有最小数据值的键
- 25. haskell长度运行时间O(1)或O(n)
- 26. 两次通过数组为O(n)或O(2N)
- 27. 使用O(logN)中的HashMap在节点的链表上进行二进制搜索时间复杂度
- 28. 分钟堆比O(logn)增加键好?
- 29. 为什么deleteMin的堆取O(logn)?
- 30. 在O(n)中运行的数组“最大差异”算法?
“是否可能”。不。 – Kevin 2014-10-06 20:10:22
如果它是一个*排序*的布尔数组,可以在O(1):D – user2864740 2014-10-06 20:12:08
@Kevin中找到它是可能的。从数组的开始和结尾读取,直到计数器小于arraySize-counter。 – StackFlowed 2014-10-06 20:13:17