正方行列が魔法の行列であるかどうかを検証するためにO(n²)
よりもうまく機能するアルゴリズムはありますか(たとえば、すべての行の合計、cols、および対角線が互いに等しいなど)?
誰かが数日前にWebサイトでO(n)
の時間について言及しているのを見ましたが、その方法を理解できませんでした。
それはすべてnが何であるかに依存します。 nが行ごとの要素数であると言う場合、行列がO(n²)未満の魔法であるかどうかを確認できません。 nが行列の要素の総数であると言う場合、O(n)の時間の複雑さを持つアルゴリズムを簡単に作成できます。
時間の複雑さを分析したいくつかのpsevdoコードは次のとおりです
columvalue = rows[0]; O(1)
diagonalvalue1 = rows[0][0] O(1)
diagonalvalue2 = rows[0][-1] O(1)
magicNumber = sum(rows[0]); O(c)
diagonal count = 1
for r in rows: O(r)*(
diagonalvalue1 += r[0+diagonalcount] O(1)
diagonalvalue2 += r[-1-diagonalcount] O(1)
diagonalcount += 1 0(1)
rowsum = 0 O(1)
i = 0 O(1)
for n in r: 0(c)*(
rowsum += n O(1)
columvalue[i] += n O(1)
i += 1 0(1)
)
if rowsum != magicvalue: O(1)
return False O(1)
)
for c in columvalue: O(c)*(
if c != magicvalue: O(1)
return False O(1)
)
return diagonalvalue1 == magicvalue and
diagonalvalue2 == magicvalue O(1)
これにより、O(c) + O(r * c)の時間の複雑さが得られます。ここで、c =コロンの数、r =行の数です。O(r * c)> = O(c)時間の複雑度はO(r * c)であると言えます。これはnである行列の要素の数であり、これによりO(n)の複雑度が得られます