ハッシュマップを実行する方法
15566 ワード
メモリ内のすべての要素が連続しているので、配列は特定のインデックスで要素を検索するのに驚くべきものです
を実装できますか
このレッスンは、もともと2007年に出版されましたhttps://algodaily.com , 私は技術的なインタビューコースを維持し、野心的な開発者のために考える作品を書く.
注意:レギュラー
エー
以下の2つのメソッドを定義します. また、以下のハッシュ関数を提供しました
それで、ハッシュテーブルがデータをバケツに格納することによって働くということを知っています.これらのバケツにアクセスするには、Aを変換する方法が必要です
キーを使用すると、データが配列のどこにあるかを知る必要がなくなります.我々
ハッシュテーブルのスロットやバケツは、通常、Count Kin - Chi - Chi - Chi - Chinnoとそのインデックスに格納される.
解決方法:配列
クラスを書くのは良いことです.
衝突に関する言葉
ハッシュテーブル実装での衝突の解決方法は次のどれですか? 衝突の良い解決策はない.ハッシュ関数はユニークでなければならない 配列のインデックスが値のチェーンで構成されるリンクリストで、しばしば連鎖します インデックスごとに値を格納するトライを使用します すべての値をそのバケツで1つの文字列として連結する 配列のインデックスが値のチェーンから成るリンクリストでしばしば別々の連鎖を使用してください
この時点で、私たちは私たちのビルディングブロックを持っています を取る ハッシュ関数を通して実行し、 値を設定する 我々が同様にそれを保存している方法に注意してください
それは私たちと同じコンセプトです
O(1)
または一定の時間ルックアップ.しかし、しばしばインデックスを経由してルックアップを行うことはできません.ハッシュマップとハッシュテーブルは、このあたりの方法ですkeys
代わりに.を実装できますか
Map
クラスから傷?つのメソッドだけが必要です.get
and set
. 多くのプログラミング言語には、組み込みのハッシュまたは辞書プリミティブがありますJavascript
Object
と{}
しかし、私たちはこのエクササイズのためにそれを使いたくありません.このレッスンは、もともと2007年に出版されましたhttps://algodaily.com , 私は技術的なインタビューコースを維持し、野心的な開発者のために考える作品を書く.
注意:レギュラー
Javascript
オブジェクトとMap
クラスは単純なキー値ハッシュテーブル/連想配列です.エー
Map
オブジェクトは挿入順序で要素を反復処理できますが、JavaScriptObject
sは注文を保証しません.加えてObject
sはプロトタイプのためにデフォルトキーを持ちます、そしてMap
sはデフォルトキーで来ません.Here's a good breakdown 二つのうち.この運動の目的のために、両方のために同じ機能性を仮定しましょう.以下の2つのメソッドを定義します.
get(key: string)
キーを与え、そのキーの値を返します.set(key: string, val: string)
パラメータとしてキーと値を取り、ペアを格納します.hashStr
. それは衝突を避けることを試みるが、完全ではない.それは文字列値をとり、整数を返します.function hashStr(str) {
let finalHash = 0;
for (let i = 0; i < str.length; i++) {
const charCode = str.charCodeAt(i);
finalHash += charCode;
}
return finalHash;
}
console.log(hashStr('testKey'))
新しいクラスを呼びましょうHashmap
クラスを使用します.const m = new Hashmap();
m.set('name', 'Jake');
console.log(m.get('name'));
一般的なハッシュ表がどのように働くかを見直すことから始めましょうHashmap
data structure
に基づいています.我々が指摘したように、多くのプログラミング言語ではHashmap
遺産に基づくクラスHashtable
. このコードの我々の提案された実装を踏みましょう.それで、ハッシュテーブルがデータをバケツに格納することによって働くということを知っています.これらのバケツにアクセスするには、Aを変換する方法が必要です
key
バケット番号に.(バケットは、配列とツリーの両方を使ってモデル化することができますが、物事を単純にして速度を最大化するためには、配列を使うことに固執します).キーを使用すると、データが配列のどこにあるかを知る必要がなくなります.我々
data structure
したがって、この場合にはハッシュ関数が必要ですhashStr
, 計算するindex
into buckets
必要な値が格納されている場合.我々は本質的にマッピングkey
を介して配列インデックスにhashStr
ハッシュ関数.hashStr('r')
// 114
// array = [ _ , X , _ , _ ]
// index 113 114 115 116
ご覧の通り、すべてhashStr
は、key
提供set()
, そして、私たちのための場所を計算します.我々は、したがって、もう一つを必要としますdata structure
値が置かれる実際の保管とバケツのために.もちろん、あなたはすでにそれが配列であることを知っている!フィルイン
ハッシュテーブルのスロットやバケツは、通常、Count Kin - Chi - Chi - Chi - Chinnoとそのインデックスに格納される.
解決方法:配列
クラスを書くのは良いことです.
class Hashmap {
constructor() {
this._storage = [];
}
}
返り値はhashStr
入力した値がどこにあるかを決めるthis._storage
.衝突に関する言葉
collisions
ハッシュ関数が1つ以上のキーに対して同じインデックスを返す場合、この質問の範囲外です.しかし、追加のデータ構造を使用してそのような問題を処理する方法があります.複数選択
ハッシュテーブル実装での衝突の解決方法は次のどれですか?
この時点で、私たちは私たちのビルディングブロックを持っています
set
メソッド.次のようになります.key
通過storage
その特定のインデックスでthis._storage
( this._storage[idx]
) それ自体が配列であり、それによって衝突問題に対して原始的に解決される.set(key, val) {
let idx = this.hashStr(key);
if (!this._storage[idx]) {
this._storage[idx] = [];
}
this._storage[idx].push([key, val]);
}
The set
今すぐ方法はかなり簡単ですが、右?それは私たちと同じコンセプトです
get
メソッド.私たちがそこでやっていることはkey
通してhashStr
設定の代わりに、結果のインデックスに移動し、値を取得します. for (let keyVal of this._storage[idx]) {
if (keyVal[0] === key) {
return keyVal[1];
}
}
注意しなければならないのは、存在しないキーを渡すことが可能であることですset
), それで、我々は戻ることによってそれを扱うべきですundefined
もしそうならば.get(key) {
let idx = this.hashStr(key);
if (!this._storage[idx]) {
return undefined;
}
for (let keyVal of this._storage[idx]) {
if (keyVal[0] === key) {
return keyVal[1];
}
}
}
それは、それをするべきです!それを試してみましょう.class Hashmap {
constructor() {
this._storage = [];
}
hashStr(str) {
let finalHash = 0;
for (let i = 0; i < str.length; i++) {
const charCode = str.charCodeAt(i);
finalHash += charCode;
}
return finalHash;
}
set(key, val) {
let idx = this.hashStr(key);
if (!this._storage[idx]) {
this._storage[idx] = [];
}
this._storage[idx].push([key, val]);
}
get(key) {
let idx = this.hashStr(key);
if (!this._storage[idx]) {
return undefined;
}
for (let keyVal of this._storage[idx]) {
if (keyVal[0] === key) {
return keyVal[1];
}
}
}
}
このレッスンは、もともと2007年に出版されましたhttps://algodaily.com , 私は技術的なインタビューコースを維持し、野心的な開発者のために考える作品を書く.Reference
この問題について(ハッシュマップを実行する方法), 我々は、より多くの情報をここで見つけました https://dev.to/jacobjzhang/how-to-implement-a-hash-map-3jm3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol