C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で行ごと・列ごとにソートされた行列を効率的に検索する方法

この問題に対する最も基本的な解決策は、入力行列に格納されたすべての要素を順番に走査し、目的のキーを探すというものです。この線形探索アプローチでは、行列のサイズが M×N の場合、計算量は O(MN) となり、大規模なデータでは非効率になります。

しかし、この行列は「ソート済みの1次元配列」とみなすことができます。実際、入力行列のすべての行を上から下の順に連結すると、昇順に並んだ1次元配列が形成されます。そのため、この2次元配列に対しては二分探索(バイナリサーチ)アルゴリズムを適用するのが最適です。

以下のコードでは、2次元配列と検索キーを引数として受け取り、検索の成功・失敗に応じて true または false を返すメソッド SearchRowwiseColumnWiseMatrix を実装しています。ポイントは、1次元的なインデックス midmid / col(行番号)と mid % col(列番号)に変換することで、2次元配列の任意の要素に直接アクセスできる点です。

コード例

public class Matrix{
   public bool SearchRowwiseColumnWiseMatrix(int[] mat, int searchElement){
      int col = getMatrixColSize(mat);
      int start = 0;
      int last = mat.Length - 1;
      while (start <= last){
         int mid = start + (last - start) / 2;
         int mid_element = mat[mid / col, mid % col];
         if (searchElement == mid_element){
            return true;
         }
         else if (searchElement < mid_element){
            last = mid - 1;
         }
         else{
            start = mid + 1;
         }
      }
      return false;
   }
   private int getMatrixRowSize(int[] mat){
      return mat.GetLength(0);
   }
   private int getMatrixColSize(int[] mat){
      return mat.GetLength(1);
   }
}
static void Main(string[] args){
   Matrix m = new Matrix();
   int[] mat = new int[3, 4] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
   Console.WriteLine(m.SearchRowwiseColumnWiseMatrix(mat, 11));
}

出力結果

TRUE

この実装により、時間計算量は O(log(MN)) まで削減されます。線形探索の O(MN) と比較して大幅に高速化されており、行ごと・列ごとにソートされた大規模な行列からも、目的の要素を短時間で見つけ出すことが可能です。

  1. Googleの逆画像検索で画像の出所と詳細を調べる方法

    何か情報を調べたいとき、多くの人がまず頼るのがGoogleです。さらにGoogleでは、オンライン上に公開されたあらゆる写真を検索することもできます。では、すでに手元にある画像について、「この画像はどこから来たのか」「いつ公開されたのか」など、出所をもっと詳しく知りたい場合はどうすればよいのでしょうか。 幸い、Googleには「逆画像検索(画像による検索)」という便利な機能が用意されています。これを使えば、画像が最初にどこで・いつ公開されたのか、画像に写っている内容は何か、そしてインターネット上に存在するその他の関連情報まで、幅広く調べることが可能です。 画像の出所を調べる基本の手順 まずは

  2. 【Excel】行と列を固定する方法|ウィンドウ枠の固定と分割機能の使い方

    大きなExcelスプレッドシートを扱っていると、特定のデータを何度も確認しながら比較・入力作業を進めることがよくあります。参照したいデータは行の場合もあれば、列の場合もあります。スクロールするたびに見出しが画面外に消えてしまうと、作業効率が下がり、時間も余計にかかってしまいます。そんなときに役立つのが「ウィンドウ枠の固定(フリーズ)」機能です。この機能を使えば、指定した行や列を常に画面に表示したまま、シートを自由にスクロールできるようになります。この記事では、Excelで行や列を簡単に固定する方法を詳しく解説します。あわせて、「ウィンドウ枠の固定」の代わりに使える「分割」機能による代替手段もご