ハッシュとは何かを理解するのに役立つ記事

ハッシュとは何ですか?

最初にそのような問題を見てみましょう:N個の正の整数、次にM個の正の整数が与えられた場合、Mに現れる各数値がNに現れたかどうかを尋ねます。ここで、N、M<=10³。

最も直感的なアイデアは、激しく列挙することです。まず、Mの数字を選び、次にNの数字と1つずつ比較します。比較後、Mの2番目の数字を選びます。しかし、この複雑さはO(MN)に達しますが、これは優れたアルゴリズムではありません。

時間にスペースを使用したい場合は、配列の添え字としてM個の整数を使用して配列を作成します。たとえば、M番号は5、9、12、7、N番号はそれぞれ9、7、12、6です。次に、最初にブール配列hashtable [Maxn] = {false}を作成し、次に添え字9、7、12、6の対応する値をfalseからtrueにトラバースし、次に5、9、12、7をトラバースします。トラバースし、hashtable [x]がtrueであるかどうかの文を追加して、発生したかどうかを判別します。

bool hashtable[10000]={false};
int mian(){
	int n,m,x;
	scanf{"%d%d",&n,&m};
	for(int i=0;i<n;i++){
		scanf("%d",&x);
		hashtable[x]=true;  //数字x出现过
	}
	for(int i=0;i<m;i++){
		scanf("%d",&x);
		if(hashtable[x]==true)
			printf("yes\n");
		else
			printf("no\n");
	}
	return 0;
}

照会するM個の各数値がN個の数値に出現する回数を尋ねると、ハッシュテーブル配列をint型に変換でき、出現するたびに++になります。(自分で試してみてください)

上記のトピックはすべて、統計の配列の添え字として直接使用されます(非常に実用的です!)。英語の冠詞での愛の文字列の出現回数をカウントしたい場合はどうでしょうか。次に、統計の添え字として愛を使用します。しかし、一般的に、添え字を付けることができるのは整数だけです。どうすればよいですか?したがって、ハッシュのアイデアを使用する必要があります。

ハッシュの公式の意味は、「整数が要素を可能な限り一意に表すことができるように、関数を介して要素を整数に変換すること」です。

人気のあるポイントは、要素を一意に表すことができる整数に変換することです。将来この整数を表示することは、要素を表示することと同じです。次に、この整数を下付き文字として使用して、この文字を実際に下付き文字として使用します。アイデア、それはすべてが下付き文字になることができるということではありません。

一般的に使用される方法は、除算と剰余法、線形探索法、二乗探索法、チェーンアドレス法などです。これらの方法については、次の章で省略できるため、ここでは詳しく説明しません。

C ++には、文字を直接添え字化できるマップライブラリがあります。コンピュータはすでにこれらの文字をハッシュしており(つまり、ハッシュの英語はハッシュであるため、ハッシュ)、次にタイトルを表示します。練習しましょう。 。

トピック:購入するかどうか
問題の説明:Xiaohongは、好きなビーズのストリングを作るためにいくつかのビーズを購入したいと考えています。ビーズの売り手は色とりどりのビーズのひもをたくさん持っていましたが、どのひもをバラバラに売ることはありませんでした。それで、Xiaohongは、特定のビーズのストリングに必要なすべてのビーズが含まれているかどうかを判断するのを手伝ってくれるように頼みますか?もしそうなら、彼女が持っている余分なビーズの数を彼女に伝え、そうでない場合は、不足しているビーズの数を彼女に伝えてください。
分析:ここでは、0 9、a z、A〜Zの範囲の文字を使用して色を表します。
入力形式:テストケースごとに、ストールの所有者のビーズとXiaohongが購入および作成するビーズをそれぞれ2行で指定し、2つのストリングが1000ビーズを超えないようにします。
出力形式:購入できる場合は、YESと追加のビーズの数を出力します。そうでない場合は、NOと1行に欠落しているビーズの数を出力します。ピリオドはスペースで区切られます。
入力ユースケース:
ppRYYGrrYBR2258
YrR8RrY
出力サンプル:
YES 8

アイデアの分析:上司のビーズをハッシュテーブルに入れ、ビーズの色をキーとして使用し、ビーズの数を値として使用してキーと値のペアを形成し、Xiaohongが必要とするビーズの色を次のように使用します。上司のビードハッシュテーブルにアクセスするためのキー。ある場合は、上司のビードハッシュテーブルに対応する値が1つ減ります。そうでない場合は、不足しているビードが1つ追加されます。最後に、不足しているビードがより大きい場合0の場合、購入できないことを意味し、不足しているビーズが出力されます。不足しているビーズが0に等しい場合(つまり、ビーズの不足がない場合)、この時点で、ボスの真珠の数Xiaohongの真珠の数を引いたものが余分な真珠の数です。

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

int main() {
	int lack=0,surplus=0;
	string boss;
	string hong;
	cin >> boss;
	cin >> hong;
	map<char, int> pearl;//哈希表没有键值对的地方就是0-0
	for (int i = 0; i < boss.length(); i++) {
		pearl[boss[i]]++;
	}
	for (int i = 0; i < hong.length(); i++) {
		if (pearl[hong[i]] == 0)
			lack++;
		else
			pearl[hong[i]]--;//相当于把珠子给了小红,然后摊主的珠子减一,防止后面小红要好多颗珍珠,摊主就只有一颗珍珠在这里唬人
	}
	surplus = boss.length() - hong.length();
	if (lack > 0)
		cout << "NO!!" << "  " << lack << endl;
	else
		cout << "YES!!" << "  "<< surplus  <<endl;
	return 0;
}

これを見た後、ハッシュとは何か、使い方を理解できたと思います。もっと練習する必要があります。

おすすめ

転載: blog.csdn.net/Dai_sir_man/article/details/120182871