n比特矩阵算法

时间:2014-10-17 18:45:07

标签: algorithm matrix data-structures divide-and-conquer

给出了两个函数P1, P2,它接受​​输入n-bit x,并计算y1=A1*x, y2=A2*xA1A2n*n位矩阵。这两个函数返回n位数组y1,y2。我们不知道有关这些矩阵的任何信息,但知道A1A2除了一个广告位(i,j)之外是相同的。 (ij对我们来说不得而知)。我们可以为P1的不同值调用P2x,然后比较这两个函数的输出。我想找到我们可以找到多少来电i, j

在简短的回答中,我们的书写道:Log n来电。任何提示或想法?感谢所有人。

编辑:有人说,首先x是一个“1”的列矩阵。并计算y1y2并找到不同的行。然后x是一个矩阵,n/2元素为“1”,n / 2底元素为“0”。如果y1y2相等,则n/2+1n1n/2 ...

1 个答案:

答案 0 :(得分:0)

如果您可以转置A1A2,则可以通过两次通话完成:

您可以通过执行一次调用来确定i,主要检查y1y2中的哪个条目有所不同。那样会给你i

转置A1A2,做同样的事情,不同的条目是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