这是我关于stackoverflow的第一个问题。我一直在解决#34;算法设计"作者:古德里奇,塔玛西亚。但是,我对这个问题一无所知。 Unusre从哪里开始以及如何继续。任何建议都会很棒。这就是问题所在:
布尔矩阵是矩阵,每个条目为0或1,矩阵乘法通过使用AND表示*和OR表示+。假设我们给出了两个NxN随机布尔矩阵A和B,以便任何条目的概率 在任何一个是1,是1 / k。证明如果k是常数,那么有一个算法用于乘以A和B,其预期运行时间为O(n ^ 2)。如果k是n,怎么办?
答案 0 :(得分:7)
使用标准迭代方法的矩阵乘法是O(n 3 ),因为你必须迭代n行和n列,并且对于每个元素执行一个向量乘以其中一行和其中一列,需要n次乘法和n-1次加法。
Psuedo代码将矩阵a乘以矩阵b并存储在矩阵c:
中for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
int sum = 0;
for(m = 0; m < n; m++)
{
sum += a[i][m] * b[m][j];
}
c[i][j] = sum;
}
}
对于布尔矩阵,如问题中指定的那样,使用AND 乘法的位置和OR代替加法,所以它变成了 这样:
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
boolean value = false;
for(m = 0; m < n; m++)
{
value ||= a[i][m] && b[m][j];
if(value)
break; // early out
}
c[i][j] = value;
}
}
这里要注意的是,一旦我们的布尔&#34;总和&#34;是的,我们可以停止计算并提前退出最内层的循环,因为将任何后续值与OR进行或运算将产生真,所以我们可以立即知道最终结果是真的。
对于任何常量k
,我们可以提前做出的操作数(假设值是随机的)将取决于k并且不会随n增加。在每次迭代时,循环将有一个(1 / k) 2 的可能性,因为我们需要两个1才能发生这种情况,每个条目为1的概率为1 / k。终止前的迭代次数将遵循Geometric distribution,其中p是(1 / k) 2 ,以及预期的&#34;试验次数&#34; (迭代)之前&#34;成功&#34; (断开循环)并不依赖于n(除了作为试验次数的上限),因此对于给定的k,最内层循环以恒定时间(平均)运行,使得整个算法O( ñ 2 )。如果k = n,几何分布公式应该可以让您了解会发生什么。请注意,在维基百科上给出的公式中,k是试验次数。