ホームページ バックエンド開発 C++ ハッシュ テーブルを使用して C++ で文字列検索を実装する

ハッシュ テーブルを使用して C++ で文字列検索を実装する

Aug 22, 2023 pm 12:03 PM
c++ 探す ハッシュ表

ハッシュ テーブルを使用して C++ で文字列検索を実装する

ハッシュ テーブルは、キー値を固定サイズのテーブルにマップする非常に一般的なデータ構造で、効率的な検索、挿入、削除操作を可能にします。 C では、STL (Standard Template Library) の unowned_map を使用してハッシュ テーブルを実装できます。

実際のアプリケーションでは、多くの場合、文字列に対して検索操作を実行する必要があります。たとえば、テキスト内の特定のキーワードの出現数を検索したり、特定の文字列を含むすべての行を検索したりできます。これらのタスクを効率的に実行するために、ハッシュ テーブルを使用して文字列検索を実装できます。

今回はハッシュテーブルを使ってC言語で文字列検索を実現する具体的な方法を紹介します。テキスト内に文字列が出現する回数を求める例を使用します。

まず、文字列をハッシュ テーブルにマッピングする関数を定義する必要があります。一般的な方法は、文字列のハッシュ値をキー値として使用し、異なる文字列が異なる場所にマッピングされるようにすることです。ハッシュ関数のパフォーマンスを向上させるには、ハッシュ関数を迅速に計算し、ハッシュ競合の発生を最小限に抑える必要があります。

以下は、文字列の ASCII コードを加算し、その余りを取得する単純なハッシュ関数の実装です:

size_t hash_func(const std::string& str) {
    size_t hash_val = 0;
    for (char c : str) {
        hash_val += static_cast<size_t>(c);
    }
    return hash_val % MAP_SIZE;
}

次に、テキスト内の各単語をハッシュ テーブルに挿入する必要があります。 。テキストをスペースで単語に分割し、ハッシュ関数を呼び出すことで、テキストをハッシュ テーブルに挿入できます。キーワードは複数回出現する可能性があるため、各キーワードの出現回数を記録する必要があります。この関数を実現するには、unowned_map を使用できます。挿入中にキー値がすでに存在する場合、値は増分されます:

std::unordered_map<std::string, size_t> word_map;
for (std::string word : words) {
    if (word_map.find(word) == word_map.end()) {
        word_map[word] = 1;
    } else {
        ++word_map[word];
    }
}

最後に、ハッシュ テーブル内の文字列に対応する値を呼び出すことで、値を取得できます。テキスト内の出現数:

size_t count = word_map["target_string"];

完全なコードは次のとおりです:

#include 
#include 
#include 
#include 

const size_t MAP_SIZE = 1024;

size_t hash_func(const std::string& str) {
    size_t hash_val = 0;
    for (char c : str) {
        hash_val += static_cast<size_t>(c);
    }
    return hash_val % MAP_SIZE;
}

int main() {
    std::vector words {"hello", "world", "hello", "c++", "hash", "world", "world"};
    std::unordered_map word_map;

    for (std::string word : words) {
        if (word_map.find(word) == word_map.end()) {
            word_map[word] = 1;
        } else {
            ++word_map[word];
        }
    }

    size_t count = word_map["world"];
    std::cout << "The word 'world' appears " << count << " times." << std::endl;

    return 0;
}

上記のコードでは、ハッシュ テーブルを使用して、テキスト内に文字列が出現する回数をすばやくカウントできます。文章。ハッシュ テーブルを使用すると、検索パフォーマンスが向上しますが、これは大量のデータの場合に顕著であり、実際のアプリケーションでは優れた柔軟性と拡張性も備えています。

以上がハッシュ テーブルを使用して C++ で文字列検索を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Stock Market GPT

Stock Market GPT

AIを活用した投資調査により賢明な意思決定を実現

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

cで例外セーフコードを書く方法は? cで例外セーフコードを書く方法は? Aug 29, 2025 am 08:17 AM

useraiitotiereSourcemanagementto objectlifetimes、clueanupviadestructorsstackunwinding.2.aimforstrongorno-throwexceptionsafetyguaranteesを保証すること、避けて、

文字列をCの大文字または小文字に変換する方法 文字列をCの大文字または小文字に変換する方法 Sep 01, 2025 am 06:36 AM

文字列を大文字または小文字に変換するには、:: Toupperまたは:: Tolower関数と組み合わせたSTD ::変換を使用します。 1。ヘッダーファイルを含めます。 2。STD:: Transformを呼び出し、文字列の開始および終了反復因子を渡し、str.begin()に出力イテレータを指定して、所定の位置に変更します。 3。使用:: Toupperを使用して各キャラクターを大文字に変換するか、:: Tolower to loshcaseに使用します。この方法はASCII文字列に適しており、コードはシンプルで効率的です。非ASCIIまたはUnicodeテキストの場合、ICUなどのライブラリを使用して適切な処理を確保する必要があります。手動サイクルは非常に読みやすいですが、効率が低くなります。したがって、std ::を使用することをお勧めします

Linux Linux FIFOスケジューリングポリシーで処理する方法 Linux Linux FIFOスケジューリングポリシーで処理する方法 Sep 03, 2025 pm 12:39 PM

LinuxプロセスをリアルタイムFIFOスケジューリングで実行するには、CHRTコマンドまたはSched_SetsCheduler System Callを使用して、Sudochrt-F999./AppまたはConfigure sched_fifoおよびPriorityパラメーターをCプログラムで設定し、プロセスがCAP_Sys_sys_Sys_sysの能力またはrutの責任を介してCAP_Sys_Sys_sysの可能性を介して構成されていることを確認する必要があります。実際のタイミングを確保し、優先度の逆転を避けるため。優先順位継承をサポートするミューテックスを使用する必要があります。

cインラインネームスペースの例 cインラインネームスペースの例 Sep 01, 2025 am 02:01 AM

InlinEnamespaceは、主にバージョン制御とシンボルの透明性の露出に使用され、そのメンバーは外側の名前空間で直接アクセスできます。 inlinineNamespaceの名前は、外側の名前空間の直接メンバーと見なされ、内側の名前空間を指定せずに使用できます。 wribory一般的にライブラリバージョン管理に使用されます。 V1がインラインに設定され、アップグレード中にV2に変更された場合、古いバージョンには明示的な名前空間を介してアクセスできます。 ABI互換性の設計をサポートすると、新しいバージョンタイプがデフォルトで公開され、古いバイナリインターフェイスは非インラインネームスペースに保持されます。 bedされ、複数の存在をネストすることができますが、通常はデフォルトとして拡張されるのは通常1つだけです。 auterouteouterネームスペースには、デフォルトのインラインサブナメシススペースが1つしかないことに注意してください。ユーザーは避ける必要があります

クロノスとは何ですか?それは良い投資ですか? Cro Coinの将来の価格予測 クロノスとは何ですか?それは良い投資ですか? Cro Coinの将来の価格予測 Sep 02, 2025 pm 08:51 PM

内容クロノス(CRO)とは何ですか?CROとOriginsの重要なニュースとイベントの背後にある技術チームのCROとSOLANAの比較の主な機能がいくつありますか?エコシステム、およびこのプロジェクトは、イーサリアムとコスモスのブロックチェーンの交差点での位置で有名です。基礎として

std :: function and std :: bindの使用方法c std :: function and std :: bindの使用方法c Sep 01, 2025 am 07:26 AM

std :: function and std :: bindは、コール可能なオブジェクトを処理するためにCで使用されるツールです。 STD ::関数は、互換性のある署名で呼び出し可能なオブジェクトを包むことができます。コールバック、イベントシステム、その他のシナリオに適しています。関数、ラムダ、ファンサー、およびメンバー機能をサポートします。 std :: bindは、関数のいくつかのパラメーターを修正して、パラメーターのバインディングと再配置によく使用される新しい呼び出し可能なオブジェクトを生成することができますが、c 11 lamdaはより明確で効率的であるため、より推奨されるためです。使用する場合は、ヘッダーファイルを含める必要があります。 STD ::関数のオーバーヘッドの消去型はあることに注意してください。 std :: bindはモバイル排他的なタイプの予期しない複製を引き起こす可能性があるため、複雑でのみLambdaを使用することをお勧めします

c揮発性キーワードの例 c揮発性キーワードの例 Sep 05, 2025 am 06:54 AM

揮発性は、変数の値がいつでも外部因子によって変更される可能性があることをコンパイラに伝えるために使用され、したがって、毎回メモリから読み直す必要があります。 1.埋め込まれたシステムでは、ハードウェアレジスタの値をハードウェアによって非同期に変更することができ、揮発性を使用すると、コンパイラが読み取りを1つと無限のループに最適化することができなくなります。 2。信号プロセッサでは、グローバル変数が信号プロセッサによって変更される場合、揮発性として宣言する必要があります。そうしないと、コンパイラがレジスタにキャッシュし、メインループが変更を感じることができなくなります。 3. Volatileはスレッドの安全性を提供しません。マルチスレッドシナリオはSTD :: AtomicまたはMutexロックを使用する必要があります。 4.一般的な用途には、メモリマッピングハードウェアの共有変数、信号処理、および非同期コールバックが含まれます。 5。使用します

Cプログラムをコンパイルして実行する方法 Cプログラムをコンパイルして実行する方法 Sep 16, 2025 am 05:29 AM

installac compilerlikegを使用して、packagemanagordedordementtoolsdependingontheos.2.writeac andsaveitwitha.cppextension.3.compiletheprogramusingg hello.cpp-ohellotogenerateanexecutable.4.runtheexecutable

See all articles