テンセント顔質問:どのように迅速URLで集計2000万URL内のURLかどうかを判断するには?

転載:https://mp.weixin.qq.com/s/JRdBChotOgIQb9w6eGKqmQ

遭遇したような問題を想定します。サイトのURLは20億ブラックリストに存在し、どのように保存するブラックリスト?今回は気軽にURLを入力すると、すぐにこのブラックリストかどうかを判断するためにどのようにURLをあなたは?そして、与えられたメモリ空間に必要な:すぐ内側(例えば500Mなど)を決定

多くの人が最初に考えを用いることであろう  HashSetとして、  HashSet基礎  HashMap理論的には、時間の複雑さは、次のとおりですO(1)急速な終わりますが、それのスペースの複雑さを実現!整数のハッシュ値によって得られたURL文字列、整数4バイト、つまり20億URLは、理論的に必要とする:20亿*4/1024/1024/1024=7.45Gメモリ、複雑さは、スペースの要件を満たしていません。

ここでは、本明細書に記載されるように、「ブルームフィルタ」につながります。

ブルームフィルタとは何ですか

ブルームによって提案された1970年のブルームフィルタ(ブルームフィルタ):ブルームフィルタにWikipediaの導入がこれです。これは、実際には、ランダムなバイナリーベクターとマッピング機能の長いシリーズです。ブルームフィルタは、以下の場合にセット内の要素を取得するために使用することができます。利点は欠点が特定のエラー認識率であり、困難を取り除くことで、一般的なアルゴリズムよりもスペース効率とクエリ時間がはるかに優れています。

あるいは、上記の例では、例えば:

最大の整数から導出されたハッシュアルゴリズムのハッシュ値:Integer.MAX_VALUE=2147483647任意は0〜2147483647のURLをハッシュすることを意味します。

我々は、すべての可能な値のセットを格納するために使用される長さ2147483647のビットの配列を定義することができます。バイト配列を格納するために、システムにのみ必要です2147483647/8/1024/1024=256M

たとえば、次のURL(X)ハッシュは、次に、バイト配列であろう1れるビットの配列で2位に落ち、2:000 ...全カザフスタンの0.00000010、繰り返し、これら20億数ギリシャは、アレイ内のビットを落下します。

ロジックの分析:

バイト配列に第2ビットが1である場合、URL(X)が存在していてもよいです。なぜそれが可能ですか?他のURL陰Haxi衝突ハッシュをそこに可能性があるため偽である、2です。

バイト配列の第二位が0の場合でも、その後、URL(X)は、確かに、コレクションに存在しません。

何回もハッシュ:

陰Haxi衝突に対する偽陽性の確率を低減するために、異なるハッシュアルゴリズムN回ハッシュこのURL(X)に対して行うことができる、ハッシュ値NがNであればビットは、アレイ上に落下、派生しました何の位置が1でない場合、URL(X)は、確かに、コレクションに存在しません。

アルゴリズムの特長

図1に示すように、ハッシュ、高い時間効率によって決定されます。スペース効率にも大きな利点です。2、正義の流産は、特定のシーンのために使用する必要があるかもしれませんがあります。彼らはハッシュ衝突を区別できないので3、、削除操作を行うには良くありません。

利用シナリオ

1、ブラックリスト2、URL再図3に示すように、このような順序IDシステムクエリとして単語のスペルチェッカ4、キー較正5、ID確認キー値キャッシュシステムを、直接的なリターンが存在しない場合、注文があるかどうか。

おすすめ

転載: www.cnblogs.com/shengguorui/p/11430115.html