【发布时间】:2011-03-23 16:50:35
【问题描述】:
这是我的面试问题之一。
我们有一个包含整数的矩阵(未提供范围)。矩阵随机填充整数。我们需要设计一种算法来找到与列完全匹配的那些行。我们需要返回匹配的行号和列号。匹配元素的顺序相同。例如,如果第 i 行与第 j 列匹配,并且第 i 行包含元素 - [1,4,5,6,3]。然后第 j 列也将包含元素 - [1,4,5,6,3]。大小为 n x n。 我的解决方案:
RCEQUAL(A,i1..12,j1..j2)// A is n*n matrix
if(i2-i1==2 && j2-j1==2 && b[n*i1+1..n*i2] has [j1..j2])
use brute force to check if the rows and columns are same.
if (any rows and columns are same)
store the row and column numbers in b[1..n^2].//b[1],b[n+2],b[2n+3].. store row no,
// b[2..n+1] stores columns that
//match with row 1, b[n+3..2n+2]
//those that match with row 2,etc..
else
RCEQUAL(A,1..n/2,1..n/2);
RCEQUAL(A,n/2..n,1..n/2);
RCEQUAL(A,1..n/2,n/2..n);
RCEQUAL(A,n/2..n,n/2..n);
花费 O(n^2)。它是否正确?如果正确,是否有更快的算法?
【问题讨论】:
-
问题 - 如果其中一行是 [1,2,3] 并且其中一列是 [2,3,1] 是否被视为匹配?
-
不,它们的顺序必须相同。
-
不是立方吗?如果您将 n 行中的每一行与 n 列中的每一列进行比较,那就是 n*n 比较,并且每次比较的长度可能为 n (最坏情况)。随机数据的平均值可能是 n 平方。
-
它的 T(n)=4T(n/2)+O(1) 即 O(n^log4)=O(n^2)
-
对不起,这个问题已经有一段时间没有添加了,但我必须问,这不是n^2吗?您可能会进行 n/2 比较,因此您的重复次数不能为 + O(1)。这里有什么见解/技巧基本上阻止您将每一行与每一列进行比较?