Pythonで与えられた行列がテプリッツ行列かどうかを判定するプログラム
テプリッツ行列とは?
ある行列 M が与えられたとき、それがテプリッツ行列(Toeplitz matrix)であるかどうかを判定することを考えます。テプリッツ行列とは、左上から右下へ向かうすべての対角線(斜めの並び)上の要素が同じ値であるような行列のことです。
例として、次のような入力行列を考えてみましょう。
| 7 | 2 | 6 |
| 3 | 7 | 2 |
| 5 | 3 | 7 |
この行列では、どの対角線を見ても値が一定になっています。たとえば「7 → 7 → 7」「2 → 2」「3 → 3」といった具合です。したがって、この場合の出力は True となります。
判定アルゴリズムの考え方
テプリッツ行列の性質を利用すると、判定は非常にシンプルです。各要素は、そのすぐ右下の要素と必ず等しくなければなりません。そこで、次の手順で確認します。
- 最後の行を除く各行
iについて繰り返す- 最後の列を除く各列
jについて繰り返すmatrix[i][j]とmatrix[i+1][j+1]が等しくない場合は、その時点でFalseを返す
- 最後の列を除く各列
- すべてのチェックを通過したら
Trueを返す
この方法なら、行列内の隣接する対角要素だけを比較すればよいため、効率的に判定できます。
Pythonでの実装例
以下が実際の実装コードです。
class Solution: def solve(self, matrix): for i in range(len(matrix)-1): for j in range(len(matrix[0])-1): if matrix[i][j]!=matrix[i+1][j+1]: return False return True ob = Solution() matrix = [ [7, 2, 6], [3, 7, 2], [5, 3, 7]] print(ob.solve(matrix))
入力
[[7, 2, 6], [3, 7, 2], [5, 3, 7]]
出力
True
計算量について
このアルゴリズムは、行列のすべての要素を一度ずつ調べるため、行数を m、列数を n とすると時間計算量は O(m × n) になります。追加のデータ構造を使わずに行内で判定できるため、空間計算量は O(1) と非常に効率的です。
まとめ
テプリッツ行列の判定は、「各要素とその右下の要素が等しいか」を全要素に対して確認するだけで実現できます。Pythonでは二重ループを使ったシンプルな実装で対応でき、面接や競技プログラミングでもよく出題される基本的な問題なので、ぜひ覚えておきましょう。
-
Pythonで与えられたグラフが2部グラフかどうかを判定するプログラム
2部グラフとは無向グラフが与えられたとき、そのグラフが2部グラフ(バイパータイトグラフ)であるかどうかを判定する方法を解説します。2部グラフとは、グラフのすべての頂点を2つの集合 A と B に分割でき、グラフ内のすべての辺 {u, v} が必ず一方の端点 u が集合 A、もう一方の端点 v が集合 B に属するようなグラフのことです。つまり、同じ集合内の頂点同士を結ぶ辺(A-A や B-B)が一切存在しないグラフです。例として、次のようなグラフを考えてみましょう。この場合、頂点 [0, 4] を集合 A に、[1, 2, 3] を集合 B に分類できます。すべての辺は A から B、または
-
指定された文字列がキーワードであるかどうかを確認するPythonプログラム
この記事では、指定された文字列がPythonのキーワード(予約語)であるかどうかを判定する方法について解説します。問題の概要与えられた文字列が、Pythonにおけるキーワードであるかどうかを確認する必要があります。キーワードとは、言語によって特別な用途のために予約されている単語であり、変数名や関数名などの識別子として使用することはできません。例えば「if」「for」「while」「def」などはすべてキーワードです。これらの名前を変数に使おうとすると、構文エラーが発生します。解決策:keywordモジュールの活用Pythonには標準ライブラリとしてkeywordモジュールが用意されており、これ