C++で行列の各列の最大要素を見つける方法
行列が与えられたとき、その行列の各列の最大要素を見つけて出力するのが本記事の目的です。このタスクは非常にシンプルで、各列ごとに最大値を初期化し、列内のすべての要素を順に比較しながら最大値を更新していくだけです。それでは、理解を深めるために実際のコードを見ていきましょう。
アルゴリズムの考え方
基本的な手順は以下の通りです。
- 列を表すインデックス i を 0 から cols-1 まで順に走査します。
- 各列の処理を開始する際に、最大値をその列の先頭要素 mat[0][i] で初期化します。
- 行を表すインデックス j を 1 から rows-1 まで走査し、mat[j][i] が現在の最大値より大きければ最大値を更新します。
- 列の走査が完了したら、その列の最大値を出力します。
行列の全要素を一度だけ走査するため、計算量は O(rows × cols) となります。
サンプルコード
#include<iostream>
#define MAX 10
using namespace std;
void largestInEachCol(int mat[][MAX], int rows, int cols) {
for (int i = 0; i < cols; i++) {
int max_col_element = mat[0][i];
for (int j = 1; j < rows; j++) {
if (mat[j][i] > max_col_element)
max_col_element = mat[j][i];
}
cout << max_col_element << endl;
}
}
int main() {
int row = 4, col = 4;
int mat[][MAX] = { { 3, 4, 1, 81 },
{ 1, 84, 9, 11 },
{ 23, 7, 21, 1 },
{ 2, 1, 44, 5 }
};
largestInEachCol(mat, row, col);
}出力結果
23 84 44 81
コードの解説
このプログラムでは、4×4 の行列を定義し、largestInEachCol 関数に渡しています。関数内では、外側のループで列を、内側のループで行を走査することで、各列の最大値を効率的に求めています。
出力結果から、1列目の最大値は 23、2列目は 84、3列目は 44、4列目は 81 であることが確認できます。このように、二重ループを使ったシンプルな手法で、行列の各列の最大要素を簡単に求めることができます。
-
C++で配列内の各要素のサーパッサー(Surpasser)の数を求めるアルゴリズム
ある配列Aが与えられたとき、各要素の「サーパッサー(surpasser)」の数を求める問題を考えてみましょう。サーパッサーとは、現在注目している要素よりも右側に存在する、その要素より大きい値のことです。 例えば、A = {2, 7, 5, 3, 0, 8, 1} という配列の場合、サーパッサーの数は {4, 1, 1, 1, 2, 0, 0} となります。これは、先頭の「2」の右側には「7・5・3・8」という4つの大きな値が存在するためです。その他の要素についても同じルールで数えていきます。 アルゴリズムの考え方 解法は非常にシンプルです。2重のループを使用し、外側のループで各要素を順に取り上
-
C++でグラフ行列の逆行列を求めるプログラムの実装方法
本記事では、グラフ行列の逆行列を求めるC++プログラムについて詳しく解説します。行列の逆行列は、対象となる行列が正則(非特異)である場合、すなわち行列式が0ではない場合にのみ存在します。 逆行列を求める手法は複数ありますが、ここでは随伴行列(余因子行列の転置)と行列式を組み合わせて逆行列を計算する方法を紹介します。 アルゴリズムの手順 逆行列を求める際の処理の流れは以下の通りです。 開始 行列の逆行列を求める関数 INV() を定義する。 行列式を計算する関数 DET() を呼び出す。 随伴行列を生成する関数 ADJ() を呼び出す。 次の公式に基づいて逆行