给出了两个函数P1, P2
,它接受输入n-bit x
,并计算y1=A1*x, y2=A2*x
。 A1
和A2
是n*n
位矩阵。这两个函数返回n位数组y1,y2
。我们不知道有关这些矩阵的任何信息,但知道A1
和A2
除了一个广告位(i,j)
之外是相同的。 (i
和j
对我们来说不得而知)。我们可以为P1
的不同值调用P2
和x
,然后比较这两个函数的输出。我想找到我们可以找到多少来电i, j
?
在简短的回答中,我们的书写道:Log n
来电。任何提示或想法?感谢所有人。
编辑:有人说,首先x
是一个“1”的列矩阵。并计算y1
和y2
并找到不同的行。然后x
是一个矩阵,n/2
元素为“1”,n / 2底元素为“0”。如果y1
和y2
相等,则n/2+1
至n
为1
至n/2
...
答案 0 :(得分:0)
如果您可以转置A1
和A2
,则可以通过两次通话完成:
您可以通过执行一次调用来确定i
,主要检查y1
和y2
中的哪个条目有所不同。那样会给你i
。
转置A1
和A2
,做同样的事情,不同的条目是j
的索引。
没有转置:您仍然会进行一次乘法以确定i
。现在,只做一个"二分搜索"在1
向量的条目中x
标识您的搜索区域。
第一步:用x
填充1
向量的一半,用0
填充另一个向量,进行乘法,检查索引i
处的条目是否不同,如果它不是,那么你的j
就在下半场的某个地方,如果它不同,那么它就在你的上半场(你感受到的那个1
)
第二步:将上一步中的一个选定部分拆分为两部分,其中一部分为1
,另一部分为0
,重复相同的逻辑,直到您只留下一个条目。那个是您j
由于您总是在2中分割,因此您将进行log(n)
次呼叫。
Determine `i` entry by doing one call. (trivial)
length = n/2
start = 0
while(not found)
var x[start..start+length) = 1 (0 all otter entries)
do function calls
if result1[i] == result2[i]
start = 0
length = length/2
else
start = length+1
length = length/2
if length == 1
found.
start is your index j