現在、C#でカスタムDeflateの実装を作成しようとしています。連鎖ハッシュテーブルと理解解散
私は現在、(最大)32kのデータを持っていて、入力に対して最も長いパターンを検索しようとしているところで、「パターン検索」の部分を実装しようとしています。デフレートを定義
RFC 1951は、そのプロセスについて述べている:
コンプレッサーは3バイト配列に動作ハッシュ関数を使用して、重複した文字列を検索するために連鎖ハッシュテーブルを使用しています 。圧縮中の任意の点で 与えられたポイントで、XYZを検査される の次の3入力バイトにします(必ずしもすべてが異なるわけではありません)。まず、 コンプレッサは、XYZのハッシュチェーンを調べます。チェーンが空の場合、 は、Xをリテラルバイトとして書き出し、入力内の1つを バイトだけ進めます。ハッシュチェーンが空でない場合、 シーケンスXYZ(または不幸な場合には 同じハッシュ関数値を持つ他の3バイト)が発生したことを示すコンプレッサー は、XYZハッシュチェーンのすべての文字列を実際の入力データ が現在の点から始まり、最長の が選択されます。
私はハッシュ関数が何であるかを知っており、ハッシュテーブルも何であるか知っています。しかし、 "連鎖ハッシュテーブル"とは何ですか?また、どのようにそのような構造が(C#で)効率的に設計され、大量のデータを扱うことができるでしょうか? Unforunatelyでは、RFCに記述されている構造がどのように機能するのか分かりませんでした。
どのような種類のハッシュ関数を選択できますか(意味があります)?
ありがとうございます!
ウィキペディアはあなたのqn;とにかく、 "連鎖"は、ハッシュ衝突解決戦略を記述するために使用されます。 (ハッシュエントリはそれにマップされたキーに「ポイント」する) – lijie
@lijie okしかし、私はそれがすべてのデータをどのように探すかはまだ分かりません。パターン "A B B C A B B C A"を考えてみましょう。ハッシュテーブルはどのように見えますか?最初の3つの要素(それぞれのハッシュ) "ABB"のバケットが必要ですが、値は何ですか?ちょうどCのハッシュ? BBCのハッシュ?そして、新しい要素を挿入した後に最初の要素を破棄したときに、シフト操作はどのように行われますか? – muffel
uh ...バケツとキーとの間に違いがあります...潜在的に多くのキーが同じハッシュバケットにマップされます...内容はキーです(この場合、トリグラム)... "値"本当にこれらのトリグラムであるべきであることを指している – lijie