操作の結果を見つけるための高速アルゴリズムを考え出そうとしています。
- L-は
n x n
実数の対称行列です。 - A-はスパース
n x m
行列ですm < n
。各行にはゼロ以外の要素が1つだけあり、1に等しくなります。また、すべての列にゼロ以外の要素が最大2つあることが保証されます。
一つのアルゴリズムを思いついたのですが、これよりも速いものがあるはずだと思います。
Aのすべての列を、ゼロ以外の要素を持つ行番号のペアとして表します。列にゼロ以外の要素が1つしかない場合、その行番号は2回リストされます。たとえば、次のマトリックスの場合
そのような表現は
column 0: [0, 2]; column 1: [1, 3]; column 2: [4, 4]
または、単一の配列としてリストすることもできます。A = [0, 2, 1, 3, 4, 4];
これで、次のように計算できます。
for (i = 0; i < A.length; i += 2):
if A[i] != A[i + 1]:
# sum of two column vectors, i/2-th column of L'
L'[i/2] = L[A[i]] + L[A[i + 1]]
else:
L'[i/2] = L[A[i]]
計算するには、もう一度実行します。
for (i = 0; i < A.length; i += 2):
if A[i] != A[i + 1]:
# sum of two row vectors, i/2-th row of L''
L''[i/2] = L'[A[i]] + L'[A[i + 1]]
else:
L''[i/2] = L'[A[i]]
このようなアプローチの時間計算量はO(m n + m n)であり、(最終結果を得るための)空間計算量はO(n n)です。スペースやパフォーマンスの面でO(m m)に改善できるかどうか疑問に思っていますか?