[ノイズ]。 ハッシュテーブルに入る前に、みましょう 最初にいくつかの長所と短所を検討 単純なデータ構造で始まる 配列。 アレイは、私たちが保存することができたことを思い出してください 単一のデータ·タイプの要素 連続してメモリ内の。 各要素に関連付けられているため インデックス、または場所、 我々は、全てのランダムアクセスを有する 配列の要素。 換言すれば、我々は任意の要素にアクセスすることができ のインデックスで、1つのステップで 配列。 これは、アルゴリズム大したこと バイナリサーチのようにランダムに依存 アクセス。 配列の欠点は、その大きさ 固定されている。 配列データを格納するため、連続して中 メモリには、配列のサイズを指定する必要があります あなたは配列を宣言するとき。 あなたが効果的に動作を求めている 適切な量​​を確保するためのシステム 配列の要素のためのメモリの。 より多くのメモリという保証はありません、 お使いのアレイに隣接して、利用できるようになります 後で使用するために。 だから、配列は、容易に成長することはできません。 我々はまた、リンクについて学んだことを思い出してください そのため、成長することができますリスト、 要素は、メモリ内に連続していない。 リンクされたリスト内の各ノードは含まれています 私たちが保存したい要素だけでなく、 の後続の要素へのポインタ リスト。 残念ながら、我々が支払ってきた価格 ダイナミックなサイズは、ランダムアクセスで 要素。 特定の要素にアクセスするためには、 全体を横断する必要の 目的の要素があるまでリスト 達した。 私は9番を探していますので、もし、私がしたい ノードからノードへのポインタをたどる、 各ノードの値かどうかをチェックする 9に等しい。 このように、最悪の場合には、ルックアップ 遠くから効率的であるO(n)で、。 まだながら、我々は(N)、Oよりも優れて行うことができます 我々のデータ構造が上に成長させること 時間? ハッシュテーブルは、ソリューションを提供します。 ハッシュテーブルが使用される場合に迅速な 挿入、削除、およびルックアップ 要素が優先事項である。 理論的には、挿入、欠失、および参照 でも一定で達成することができる 時間。 そのため、ハッシュテーブルはとにかく何ですか? ハッシュテーブルは、結合されただけの配列です 我々は、ハッシュと呼ぶことにします機能付き 機能。 ハッシュ関数は、データの一部を取る 入力として、我々は重要なこのことを電話するよ、と 一般に呼ばれる、整数値を出力する ハッシュ値である。 ハッシュ値は、当社のキーにマップ ハッシュテーブル内の特定のインデックス。 あなたが最初ににハッシュ関数を使用すると思います ここで、ハッシュテーブル内に決定する 指定されたキーを格納します。 後で、同じハッシュ関数を使用すると思います ここで、ハッシュテーブル内に決定する 指定されたキーを検索します。 このため、ハッシュことが重要だ この関数は、一貫して出力するように動作 同じキーに対して同じハッシュ値。 ハッシュテーブルをするために使用できることを知っている すべてのタイプのデータを記憶する。 しかし、物事を単純化するために、我々はに焦点を合わせることにします 今の文字列。 ここに文字列の単純なハッシュ関数です。 このハッシュ関数は、ハッシュを計算 の最初の文字に基づいた機能 キーを押します。 「Appleは "文字" A "で始まるので、だ ハッシュテーブル内のインデックス0にマッピングされています。 同様に、「バナナ」は、インデックス1にマッピングされている と「猫」は、インデックス2にマッピングされている。 単語 "犬"である場合、友人が尋ねられた場合 表は、ハッシュへの入力 "犬"をよ 機能、意志出力ハッシュ値 3の。 「犬」は、インデックス3で保存されていないので、 「犬は」ではないという確信を持って言うことができます 表中、 我々は唯一の1を確認したにも関わらず、 テーブルの26の指標をハッシュ。 物事にスパナをスローする時間。 我々はに "アリ"を保存したい場合はどう テーブルにも? "アリ"は "アップル"が行ったように、インデックス0にハッシュします。 これは、衝突の一例であり、 同じにハッシュする2キーの結果 インデックス。 あなたのハッシュテーブルがより大きい場合であっても あなたのデータが設定され、あなたは良いを選択した ハッシュ関数は、 あなたはまだに対処するための計画が必要です 衝突、もし、彼らが発生する。 それでは2の長所と短所を説明しましょう 衝突を解決するための共通の方法: プロービング線形および個別の連鎖。 キーのハッシュにした場合の直線は、プロービング 以前に保存されたと同じインデックス キーは、次の利用可能な割り当てられている テーブル内のスロット。 だから、 "アリ"は今以来、インデックス3で保存されている インデックス0,1、および2が既に使用中であった。 そして、我々は第3ワードを保存しようとすると、その 文字「A」で始まるが、それが割り当てられている インデックス4に日時のインデックス0,1,2、および3 満ちている。 あなたも、この単純なものから見ることができるように 例では、一度衝突が、あなたを発生する 大幅にその可能性を高める 別の衝突が同じで発生します エリア。 これは、クラスタリングと呼ばれ、それがださ 重大な欠点は、線形でプロービングする。 また、最悪の場合の挿入、欠失、 ルックアップの時間は、O(n)に委譲している、 次の使用可能なスロットが持っている可能性があるため 潜在的に表の最後のスロットであっ。 多分別々の連鎖はより多くを提供します 説得力のあるソリューションを提供します。 別々の連鎖モデルでは、ハッシュ 表には、実際にはポインタの配列にある リンクされたリスト。 衝突が発生したときに、キーがあってもよい の先頭に一定の時間内に挿入された 適切なリンクリスト。 私たちは「りんご」を検索すると、今何が起こるか ハッシュテーブル内の? 最悪のケースでは、通過しなければならない インデックス0から始まる全体のリンクリスト、。 ハッシュのワーストケースの検索時間 別々の連鎖を使用するテーブルです したがって、kはO(n個/ k)は、 ハッシュテーブルのサイズ。 ちょっと待って、Kは定数である。 そのようにはO(n / k)は、実際にはO(n)は のための最悪の場合の検索時間であった リンクされたリスト。 私たちは本当にすべてを介して行っている ハッシュテーブルについての学習の悩み 我々はスタート地点だけ戻ってしまいますか? つまり、理論上からの場合もある 視点が、現実の世界では、 O(N / K)以上の大幅な改善可能性 O(n)である。 それをこのように考えて:Kであることを前提とし 10 - あなたではなく100秒待機していました または100 / K? 終了するのは、Microsoft Wordから10秒 文書をスペルチェック。 あなただけの見たように、衝突を解決する 1線形探索のようなものかを伴う 物事を遅くしている別の、 かなり。 そのため、ハッシュを選択するとよいでしょう の可能性を最小限にする機能 最初の場所で発生した衝突。 ここでは良いハッシュのいくつかのプロパティがあります 心に留めておくべき機能。 良いハッシュ関数はを利用する必要があります 指定されたキーによって提供されるすべての情報 の数を最大にするために 可能なハッシュ値。 例えば、我々は二つの文字列があれば、「CAT」 そして「キャタピラー」、我々は彼らがハッシュしたいと思います テーブルの上に別の場所へ。 ハッシュ関数は、考慮した場合 第一、二、または3文字 文字列で、衝突が発生する、 両方の単語は同じで始まるので、 3文字。 ハッシュ値が均等に分散させる必要があり ハッシュテーブルを横断。 これは、リンクの長さを減少させる リストには、衝突が発生する必要があります。 また、良い兆候だ場合、あなたのハッシュ値 非常に異なる生成することができる 類似したキーのハッシュ値、 衝突がはるかに少ない可能性が高いこと。 私たちの目標は、迅速な挿入、削除され、 と検索。 ハッシュ関数は、に重要な役割を果たしている これらの各プロセスとなります 非常に頻繁に呼び出される。 したがって、それは非常に採用して確認してください 実行を最小限にするための簡単​​、迅速なオペレーション 時間。 私は、あなたがこの簡単に楽しんできた願っています ハッシュテーブルの概要。 私の名前はローレンであり、これはCS50である。