ハッシュテーブルのストレージ構造:
1。オープンアドレス法
2.ジッパー法
ハッシュテーブルの主な機能:
大きい(0-10 ^ 9)データを小さい(0-N(Nは通常10 ^ 5から10 ^ 6))データにマップする
ハッシュ関数:-10 ^ 19から10 ^ 19までの数値を0-10 ^ 5の間の数値にマップできます
1.ハッシュ関数の書き方は?
通常の状況では、モジュラスを直接x%10 ^ 5とします。通常、モジュラスの数を素数とし、競合の可能性を最小限に抑えるために、2の累乗から可能な限り遠ざけます。
2.競合:2つの異なる番号を同じ番号にマッピングする場合はどうすればよいですか?
この問題を解決するために、オープンアドレス法またはジッパー法を使用できます。
まず、最初にハッシュ関数h(a)= bを定義します。これは、aをbにマップすることを意味します。
ここでは、zipperメソッドのみを紹介します。
ジッパー法:
リファレンス:
グラフィカルアルゴリズム
例えば:
コレクションの保守は、次の操作をサポートします。
「I x」、数値xを挿入、
「Q x」、数値xがコレクションに含まれているかどうかを確認します。
これで、N個の操作が実行され、それぞれに対応する出力が出力されます。クエリ操作の結果。
入力形式の
最初の行には、演算の数を表す整数Nが含まれています。
次のN行、各行には操作命令が含まれ、操作命令は「Ix」と「Qx」のいずれかです。
出力形式
クエリ命令「Qx」ごとにクエリ結果を出力します。セットにxが含まれている場合は「はい」、それ以外の場合は「いいえ」を出力します。
各結果は1行を占めます。
データ範囲
1≤N≤105
-109≤x≤109
入力例:
5
I 1
I 2
I 3
Q 2
Q 5
の出力例:
はい
ません
コードは次のように表示されます。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5+3;
int h[N],e[N],ne[N],idx;
void Insert(int x)
{
int t = (x%N+N)%N;
e[idx] = x;
ne[idx] = h[t];
h[t] = idx++;
}
bool find(int x)
{
int t = (x%N+N)%N;
for (int i = h[t];i!=-1;i = ne[i])
{
if (e[i]==x)
{
return true;
}
}
return false;
}
int main()
{
int cnt;
cin>>cnt;
memset(h,-1,sizeof(h));
while(cnt--)
{
string a;
int b;
cin>>a>>b;
if (a[0]=='I') Insert(b);
else
{
if (find(b))
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
}
return 0;
}