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

ハッシュマップで解く「ロックとキー」マッチング問題 ― C++実装付きでわかりやすく解説

異なるロックのリストと、それとは別にキーのリストが与えられます。この課題の目的は、与えられたリストの中から正しく対応するロックとキーの組み合わせを見つけ出し、該当するキーを対応するロックに割り当てることです。

本記事で紹介するアプローチでは、まずすべてのロックを走査してハッシュマップを作成します。その後、各キーをハッシュマップ内で検索し、一致するものが見つかった場合に、そのキーを有効なキーとしてマークしてロックに割り当てます。ハッシュマップを利用することで、全件を総当たりで比較する方法(計算量 O(n²))と比べ、はるかに効率的な O(n) での解決が可能になります。

入力と出力

入力:
ロックとキーのリスト。
lock = { ),@,*,^,(,%,!,$,&,# }
key  = { !,(,#,%,),^,&,*, $,@ }

出力:
ロックとキーの照合後:
Locks: ! ( # % ) ^ & * $ @
Keys:  ! ( # % ) ^ & * $ @

アルゴリズム

lockAndKeyProblem(lock, key, n)

入力: ロックのリスト、キーのリスト、要素数 n。

出力: どのキーがどのロックに対応するかを求めます。

Begin
    define hashmap
    for i in range (0 to n-1), do
        hashmap[lock[i]] := i   //ロックの情報をハッシュマップに登録
    done

    for i in range (0 to n-1), do
        if key[i] is found in the hashmap, then
            lock[i] = key[i]    //対応するキーをロックに割り当て
    done
End

処理の流れ

1. 各ロックを走査し、「ロックの文字 → インデックス」の対応関係をハッシュマップに登録します。
2. 次に各キーについて、ハッシュマップ内に同じ文字が存在するかを確認します。
3. 存在していれば、その位置のロックを対応するキーで置き換えます。これにより、ロックとキーが同じ順序で並んだ状態になります。

C++による実装例

#include<iostream>
#include<map>
using namespace std;

void show(char array[], int n) {
    for(int i = 0; i<n; i++)
        cout << array[i] << " ";
}

void lockAndKeyProblem(char lock[], char key[], int n) {
    map<char, int> hashMap;
    for(int i = 0; i<n; i++)
        hashMap[lock[i]] = i;          //ロック用のハッシュマップを作成

    for(int i = 0; i<n; i++)           //各キーを順に照合
        if(hashMap.find(key[i]) != hashMap.end()) {
            lock[i] = key[i];          //一致したキーをロックに割り当て
        }
}

int main() {
    char lock[] = {')','@','*','^','(','%','!','$','&','#'};
    char key[]  = {'!','(','#','%',')','^','&','*','$','@'};
    int n = 10;
    lockAndKeyProblem(lock, key, n);
    cout << "After matching Locks and Keys:"<<endl;
    cout << "Locks: "; show(lock, n); cout << endl;
    cout << "Keys: ";  show(key, n);  cout << endl;
}

実行結果

After matching Locks and Keys:
Locks: ! ( # % ) ^ & * $ @
Keys:  ! ( # % ) ^ & * $ @

計算量

時間計算量: O(n) ― ロックの登録に n 回、キーの検索に n 回の操作が必要ですが、ハッシュマップによる検索は平均 O(1) で行えるため全体で線形時間に収まります。
空間計算量: O(n) ― ロックの分だけハッシュマップにエントリを保持するため、追加のメモリが必要です。

このように、ハッシュマップを活用することで、ロックとキーのマッチング問題をシンプルかつ高速に解くことができます。要素数が多いデータセットでも実用的に動作する点が大きなメリットです。

  1. Androidでアプリをロックする方法!App Lock(指紋・パターン・パスワード対応)の使い方を徹底解説

    スマートフォンに200以上のアプリをインストールしていると、家族や友人に端末を貸したときに、勝手にアプリを開かれるのが心配になることがあります。特に小さな子どもは止めても触れてしまうもの。そこで活躍するのが、App Lock – With Fingerprint, Pattern & Passwordのようなアプリロッカーです。インストールすれば、4桁の暗証番号(PIN)、パターン、または指紋認証を使って、Androidのアプリに簡単にロックをかけられます。 なぜ「App Lock – With Fingerprint, Pattern & Password」を選ぶべき?

  2. 2022年版|Androidで使えるおすすめアプリロック15選

    Android向けのアプリロックアプリ選びにお困りですか?テクノロジーの進歩に伴い、スマートフォンのセキュリティも大きく進化しています。今や、アプリロックのないスマートフォンは考えられない時代になりました。以前は、多くのユーザーが不正アクセスを防ぐために、Androidスマホ標準のロック画面セキュリティだけに頼っていました。しかし現在では、Google Playストアに多彩な機能を備えたアプリロックアプリが数多く登場し、端末を他人の覗き見からしっかり守れるようになっています。では、どれが最良のAndroid用アプリロックなのでしょうか?前回の記事では、標準のロック画面セキュリティでAndroi