ハッシュテーブル

インタビュー中に、私は尋ねられました:辞書の基礎となるデータ構造が何であるか知っていますか?

  したがって、今日主に話しているのは、ハッシュテーブルのデータ構造がどのように見えるか、つまり、ハッシュの衝突がどのように発生するか、およびハッシュの衝突を解決する方法です。

1.定義

  ハッシュテーブル(ハッシュテーブル、ハッシュテーブルとも呼ばれます)は、キー値に基づいて直接アクセスされるデータ構造です。つまり、キーコード値をテーブル内の場所にマッピングしてレコードにアクセスし、検索を高速化します。このマッピング関数はハッシュ関数と呼ばれ、レコードを格納する配列はハッシュテーブルと呼ばれます。

  辞書ストレージ値の場合は次のとおりです。より一般的な方法でハッシュテーブルのデータ構造を理解するために、最初に次の図を見てみましょう。

put("jack","666")
put("Rose","777")
put("Evan","888")

画像

画像

  ハッシュテーブルは主に2つの部分で構成されています。

  1. ハッシュ関数

  2. 表「最下層は配列であり、一般的な配列サイズは2nです。」これが当てはまる理由は、ビット演算の便宜のためです。

ハッシュ関数とテーブルの役割

  ハッシュ関数の主な機能は、キーを操作して整数のインデックス値インデックスを生成することです。私たちのケースに対応:

  • hash("Jack") --> index = 14

  • hash("Rose") --> index = 01

  • hash("Evan") --> index = 03

  次に、インデックスに従って、対応する値がテーブル配列に格納されます。キーと値のマッピングを完了するため。

2.ハッシュ衝突

  別のデータセットをディクショナリに追加しましょう(Jeffery,999)hash("Jeffery") --> index = 03この時点で、JefferyとRoseのインデックスが両方とも3であり、競合していることがわかります。これはハッシュ衝突です。

画像

 

3.ハッシュ衝突を解決します

  ハッシュの競合を解決するための一般的な方法:

  • 1.オープンアドレス法:空の場所が見つかるまで、特定のルールに従って他のアドレスをプローブします

  • 2.Rr-Hashing「複数のハッシュ関数を設計する

  • 3.リンクリストを介して同じインデックスの要素を文字列化するなど、個別のチェーン

  今日は、主にチェーンアドレス方式を紹介します。ハッシュの衝突が見つかった場合は、次の図に示すように、単一リンクリストを使用して同じインデックスの要素を文字列化できます。

画像

画像

4.キーのハッシュ値を生き残るにはどうすればよいですか?

  一般的なタイプのキーには、整数、浮動小数点数、文字列、および定義オブジェクトが含まれる場合があります。
  キーの種類が異なれば、ハッシュ値を生成する方法も異なりますが、目標は同じです。

  • 1.各キーのハッシュ値を一意にするようにしてください

  • 2.すべての重要な情報を計算に参加させるようにしてください

  この記事のキーはすべて文字列です。例としてジャックを取り上げます。ジャックのハッシュ値は次のように表すことができます。すべてのj * n^3 + a * n^2 + c * n^1 + k * n^0  jackASCIIをチェックできるため、上記の計算で整数Tを取得し、次にそのサイズで取得できます。テーブル配列、&位运算または%去余运算、inedx添え字値を取得できます。

 

画像

  定義されたオブジェクトの整数、浮動小数点数、ハッシュ値の計算方法については、興味があれば検索でき、より体系的な説明があります。

総括する

  本日は、主にハッシュテーブルのデータ構造が値を格納する方法を紹介し、次にハッシュ衝突の生成方法とその解決方法を説明し、最後に文字列キーのハッシュ値の計算方法を紹介しました。この記事を注意深く読むと、ハッシュテーブルとは何かをより明確に理解できるようになると思います。

[The Way of Infinite Testing]パブリックアカウントへの注目、[リソースの受信]への返信、
Pythonプログラミング学習リソースの乾物、
Python + AppiumフレームワークAPPUI自動化、
Python + Seleniumフレームワーク
WebUI自動化、Python + UnittestフレームワークAPIへようこそオートメーション、

リソースとコードは無料で送信されます〜
記事の下部に公式アカウントのQRコードがあります。WeChatでスキャンしてフォローするだけです。

備考:私の個人公開アカウントが正式に開設され、ビッグデータテスト、機能テスト、テスト開発、APIインターフェイスの自動化、テストの運用と保守、UI自動化テストなどのテストテクノロジーの共有に専念しています。WeChat検索パブリックアカウント:「WuliangThe Way of Testing」、または以下のQRコードをスキャンしてください。

 注意を向けて、一緒に成長しましょう!

おすすめ

転載: blog.csdn.net/weixin_41754309/article/details/112100654