给定一个大小为n的未排序数组,显然找出数组中是否存在元素需要花费O(n)时间。
如果我们让m = log n则需要O(2 ^ m)时间。
请注意,如果对数组进行排序,则二进制搜索实际需要O(m)时间(这是多项式),但二进制搜索不能应用于未排序的数组。
是否有可能证明在数组中找到元素(是或否)的问题是以m为单位的NP完成。我应该减少什么问题以及如何减少?
任何想法都会受到赞赏。
编辑:
我上面的描述可能没有明确表达我想说的内容。
让我们通过以下方式重新解决问题。
我们有一个oracle,它是一个高度为h的二叉树,每个节点都有随机值。 I.E.不具有节点左子树中的所有值必须小于节点中的值或节点的右子树中的所有值必须大于节点中的值的树的树。但是,oracle树中的所有节点都保证具有0到2 ^ h-1之间的值。
输入是要搜索的数字。保证输入的值介于0和2 ^ h-1之间。 (输入有h位)
(假设我们每次都在搜索相同的数组,因此每次都有相同的oracle,因此树不是输入的一部分。)
问题:就h而言,这个问题是否完整。 这个问题是NP,因为如果给出树中YES节点的路径,则可以在O(h)时间内验证。
(注意,如果oracle树的属性使节点的子树小于节点,并且节点的右子树大于节点,则问题不是NP完全,因为可以应用二进制搜索。)
答案 0 :(得分:2)
在数组中查找元素 NOT NP-complete,因为它可以在线性时间中完成。 (假设P≠NP)
事实上,您在问题中提到的天真蛮力搜索算法是线性时间算法!
当我们谈论计算问题的复杂性时,我们总是根据输入的大小来测量的时间。您声称我们算法的输入大小为m = log(n)
,但在我们的情况下,输入的大小取决于数组中元素的数量,即n
供您参考,测试给定数字n
是否为素数是一个示例计算问题,其输入大小为log(n)
。问题的输入为n
,其大小为log(n)
,因为我们需要使用log(n)
位来表示二进制形式的n
。
<强>更新强>
确定性搜索算法需要Ω(n)时间用于未排序的数组。
任何搜索算法都必须读取整个输入(即数组的n个条目)。我们将通过矛盾来证明这一点。
假设搜索算法没有读取所有n个输入条目,则此算法无法读取条目。然后,您可以构造一个案例,搜索项位于此假设算法未读取的条目,这违反了算法的正确性。因此,这种算法不存在。