Grover的算法:列表在哪里?


15

格罗弗的算法时,除其他事项外,要搜索某个项目中的项目的无序列表的长度为。尽管这里有很多关于此主题的问题,但我仍然不明白这一点。y[x0,x1,...,xn1]n

以经典方式在列表中搜索

通常,我会这样设计搜索功能 因此,我将列表和所需项作为输入,得到位置列表中项目的输出。我想我已经理解,关于是通过oracle的门嵌入到算法中的,所以我们的函数变成 让我们做一个实际的例子。考虑搜索黑桃1 \ Spadesuit的王牌

search([x0,x1,...,xn1],y)=iNsuch that xi=y
yO
searchy([x1,x2,...,xn])=iNsuch that xi=y
1标准的52张卡片组按8张卡片的顺序排列:

洗牌

长度8的列表是[x0=J, x1=10, x2=4, x3=Q, _2 = 4 \ heartsuit,\ mathbf {x} _3 = Q \ clubsuit ,x4=3, x5=1, x6=6, x7=6]

所需元素是x5。我应该获得search(cards)=5。每张卡都可以使用log252=6位进行编码,该列表包含8元素,因此我们需要6×8=48位来对该列表进行编码。在这种情况下,oracle O将实现以下功能:

f(x)={1,x=10,otherwise

但是,格罗弗算法的输入不是48量子位的状态。

(注:从此处拍摄的洗牌后的图像)

格罗弗及其甲骨文

多个来源(例如,此处 -用图形解释)表明算法的输入是不同的:输入是从搜索空间,其中是列表中元素的数量。每个数字都对应于列表中元素的位置。S={0,1,2,...,N}={0,1,2,...,7}N

的输入现在是一个量子位向量,它必须是在搜索空间中的所有项目的叠加。search()log28=3|ψS

我们知道

  • |03qubits=|000对应于;J
  • |13qubits=|001对应于 ;10
  • |23qubits=|010对应于;4
  • |53qubits=|101对应于,它是所需的元素;1
  • 等等...

在这种情况下,我们有 但在这种情况下,我们的oracle必须实现函数

search(|ψ)=|53qubits
f(|ψ)={1,|ψ=|53qubits0,otherwise

构建oracle要求我们知道位于位置5。如果我们已经搜索了用于构建oracle的元素,那么执行该算法的意义何在?


我也很难理解Grover算法的优势。假设我在列表中有N个项目。在与Oracle的每次通话中,它是否评估了所有N种可能性?即使评估非常快,但是如果我们仍然需要遍历所有配置,那么Oracle评估的复杂度为O(N)。因此,Grover的算法似乎并不比哑搜索更快。它是否正确?
Sanparith Marukatat '18年

@SanparithMarukatat这是不正确的。列表中的项目是搜索中所涉及的状态的叠加术语。当Oracle在此状态下运行时,它将被视为一次操作。Oracle标记您要搜索的叠加项的能力是Grover洞察力的基本组成部分。为了了解Grover的算法,我建议您首先了解这种标记偏离所需状态的情况。之后,请确保了解状态在Oracle中的作用。|
肖邦

如果您了解这一点,那么您应该研究能够增加叠加中所需项的幅度,同时减小不需要的叠加项的幅度的算符。对我来说,最接近格罗弗(Grover)的最简单方法是查看平均数逆运算符。(有些人采用了几何视图,但我认为不清楚。)
R. Chopin

Answers:


10

如果列表中有8个项(例如在卡的示例中),则预言输入为3(qu)位。卡座(52)中的卡数量无关紧要,只需要3位就可以对8张卡进行编码。

您可以认为3位编码了您要搜索的卡列表中的位置。那么您不知道位置,但是先知知道。因此,如果您要搜索黑桃王牌,那么甲骨文便知道黑桃王牌是第6张牌(或从零开始计数为第5张牌),并实现了函数

f(x)={1,if x = 5, or binary '101'0,otherwise

PS:最好以不同的方式考虑Grover的算法:您有一个实现布尔函数的oracle,该布尔函数针对输入位的单个组合输出,否则输出零,而您的任务是找到该组合。该问题与在未排序的列表或数据库中进行搜索具有相同的复杂性,这就是为什么通常将Grover算法描述为在未排序的数据库中进行搜索的原因。但是,将该算法应用于现实世界的数据库搜索确实提出了超出算法本身的问题。Grover的算法只是搜索Oracle知道的内容。1


是的,很抱歉,这6是来自以前的编辑
包括

2
谢谢您的回答。我纠正了错误的写法。如果要构建oracle,我需要知道搜索元素的位置,执行算法有什么意义?
激怒

1
@incud确实没有任何意义。我已经更新了答案。
kludg

格罗弗的算法只是在寻找先知所知道的东西 ”:不一定。oracle可能仅在检查输入的某些特定属性,因此最终得到的结果包含比oracle itsef中编码的信息更多的信息。一个典型的例子是在电话簿中搜索。甲骨文“索要”附加到特定名称的记录,但是一旦找到正确的记录,就会获得附加到该记录的电话号码的附加信息,该信息在甲骨文中根本没有编码
glS

4

尽管对于我们而言,将oracle的功能考虑为已经计算了所有这些值可能是最容易的,但这并不是它的作用。在您描述的情况下,oracle具有8个可能的输入(即,以3(qu)位编码),并且oracle可以即时进行所需的所有计算。因此,当您尝试评估某个值的oracle时,oracle将(在这种情况下)查找x值的卡片xx对应,然后检查该卡是否为标记的卡。这个想法是,每次您调用oracle时,它都会经历一次该过程。总的来说,您对函数的求值次数与调用oracle的次数相等。任何搜索算法的目的都是尽可能少地调用该oracle。

如果这听起来有点循环(给定输入,找到与之相对应的卡),请记住您的查找表,其中x与可订购的卡相对应,这是一个不同,更简单,更快的搜索问题。xx

与更实际的使用场景相比,您的示例中的主要区别是:

  • 搜索空间通常很大。预计算所有值没有现实的前景。确实,这正是我们要避免的事情。

  • 通常,我们实际上并不说“找到黑桃王牌”。取而代之的是,有一个可以很容易地评估以测试x是否为“已标记”项目。甲骨文甚至需要一个条目就需要花费很长时间来评估这一事实,这使得甲骨文成为了实施成本高昂的部分(并且所有其他门都是免费提供的),以及为什么需要尽量减少调用次数。f(x)x

因此,实际上,经典搜索可以解决您的问题的方式是:随机选择。评估y = f x 。如果y = 1,则返回x,否则重复。f x 效果是“输入x 0是标记的条目吗?”,而不是它的实际计算。xy=f(x)y=1xf(x)x0


2

最终的问题是:“如果我们已经搜索了用于构建oracle的元素,那么执行该算法又有什么意义呢?”

虽然有人预先构建了甲骨文,但可能不是使用甲骨文的人。

Grover的算法要求查询oracle的次数不超过size of list。自然地,我们不能希望前面提到过的各自的数据库查找(我不能因为缺乏声誉而对此发表评论),例如,如果我们的内容没有被这500万个键中的任何一个寻址,则说500万个键将返回我们想要的内容。第九百万个密钥,这恰好不在我们的样本中。那么,格罗弗的算法是如何做到的?

我们问甲骨文:它已经对已经存在的问题有什么答案?甚至Mateus和Omar也会在运行时询问“ oracle-for-a-specific-alphabet-symbol”,其符号在已编译的字符串中的位置是什么?甲骨文只会在一次咨询后为我们的查询提供答案,但是在这个故事中,它无法例如简单地将答案写成二进制字符串并通过传统的通信渠道发送给我们。它会将答案隐藏起来,以便我们将其绘制出来。

我想让幻想或隐喻在接下来的时间里消失:我们第一次没有完全听到答案,我们不得不要求甲骨文一遍又一遍地重复同样的答案,直到我们确定甲骨文说了什么,除非我们问太多次,否则我们会从传播过程中的错误信息中产生幻觉。


2

鉴于您提供的预言,搜索确实没有意义。但是,该预言机错过了Grover算法的要点,因为在一副纸牌中搜索纸牌并不是非结构化搜索,因为如您所述,您已经知道顺序。太好了,您的搜索是结构化的。使用该预言的原因是,它证明了Grover的应用方式,而不必讨论使Grover有用的预言,因为这样的预言将比价值更复杂。因此,一个更好的预言来证明格罗弗的用处可能是这样的:

f(x)={1,x[0,,3]+x[4,,7]=10100,otherwise

该oracle的含义是,您进行了8个量子位的搜索,将前四个量子位添加到后四个量子位,如果加法运算结果为10(二进制为1010),则翻转M。该oracle与您提供的oracle之间的区别在于,此oracle测试一个模式(将操作数加到10),而您测试相等(该索引为5)。这个Oracle很难构建,但是它利用了Grover的真正功能,从本质上讲,这是蛮力搜索,其中Oracle定义了搜索空间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.