web-dev-qa-db-ja.com

複雑さが最小のN×N行列の魔方陣チェック

正方行列が魔法の行列であるかどうかを検証するためにO(n²)よりもうまく機能するアルゴリズムはありますか(たとえば、すべての行の合計、cols、および対角線が互いに等しいなど)?

誰かが数日前にWebサイトでO(n)の時間について言及しているのを見ましたが、その方法を理解できませんでした。

4
Koray

それはすべて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)の複雑度が得られます

4
nist