目次
文字列の処理:
ハッシュテーブルの構成
M スロット
ハッシュ関数
ハッシュ アルゴリズムを通じてスロットを検索
总结
补充一个小知识点
ホームページ ウェブフロントエンド jsチュートリアル JavaScript のハッシュ テーブル (ハッシュ テーブル) の詳細な紹介 (コード例)

JavaScript のハッシュ テーブル (ハッシュ テーブル) の詳細な紹介 (コード例)

Jan 02, 2019 am 09:37 AM
javascript node.js データ構造

この記事では、JavaScript のハッシュ テーブル (ハッシュ テーブル) について詳しく説明します。必要な方は参考にしてください。

ハッシュ テーブル

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

JavaScript のハッシュ テーブル (ハッシュ テーブル) の詳細な紹介 (コード例)

上の図から分析を開始します。

  • 1000、10、1000 の集合 U があります。 152、9733、1555、997、1168

  • 右側は 10 個のスロットのリスト (ハッシュ テーブル) です。集合 U 内の整数をこのリストに格納する必要があります##。

  • #それをどのスロットに保管するか?この問題はハッシュ関数を使用して解決する必要があります。私の保存方法は、10 の余りを取得することです。この図を見てみましょう

    • 1000 =0, 10 =0 すると、2 つの整数 1000 と 10 が保存されます。スロット番号が 0

    • 152 =2 の場合、スロット 2

    • 9733 =3 スロット番号 3## に格納されます。

#上記の簡単な例を通じて、次の点を一般的に理解できるはずです

    集合 Uは、ハッシュ テーブルに表示される可能性のあるキーです。
  • #ハッシュ関数は、セット U 内のキーを変換する独自の設計方法です。値は、何らかの方法でハッシュ テーブルに保存されます。計算 (例の残りなど)
  • #ハッシュ テーブルには計算されたキーが格納されます
  • 次に、通常どのように取得するかを見てみましょう。値?

たとえば、キー 1000 と値 'Zhang San' を保存します ---> {key: 1000, value: 'Zhang San'} 上記の説明より、それは1000のスロットに格納されるべきですか?

キーを通じて値 Zhang San を見つけたい場合、キー スロット内を検索するだけでよいでしょうか?この時点で、立ち止まって考えることができます。


ハッシュに関するいくつかの用語 (簡単に見てみましょう)

ハッシュ テーブルに表示されるすべてのキーは完全セット U
    # と呼ばれます
  • ##スロットの数を表すには M を使用します。

  • キーが与えられると、ハッシュ関数はそれがどのスロットに表示されるかを計算します。ハッシュ関数 h=k%上記の例 M では、ハッシュ関数 h はキー k からスロットへのマッピングです。

  • 1000 と 10 は両方とも 0 番のスロットに格納されます。この状況は衝突と呼ばれます。

  • これを読んで、ハッシュ関数とは何かについて一般的に理解できたかどうかはわかりません。この例と考え方を通じて、記事の冒頭にあるハッシュ テーブルの定義を遡って読むことができます。読めれば理解できると思います。

  • 一般的に使用されるハッシュ関数

整数 h=>k%M の処理 (つまり、上記の例)

文字列の処理:

    function h_str(str,M){
        return [...str].reduce((hash,c)=>{
            hash = (31*hash + c.charCodeAt(0)) % M
        },0)
    }
ログイン後にコピー

ハッシュアルゴリズムはここでは焦点ではありません、そして私はそれを深く勉強していません。ここで重要なことは、ハッシュテーブルがどのようなデータ構造であり、どのような利点があり、具体的には何をするのかを理解することです。

ハッシュ関数は、特定のアルゴリズムを通じてキーをリストにマッピングするだけです。

ハッシュテーブルの構築


上記の説明を踏まえて、ここで簡単なハッシュテーブルを作成していきます

ハッシュテーブルの構成

M スロット

  • ハッシュ関数があります

  • キー値をハッシュ テーブルに追加する add メソッドがあります

  • 削除するための delete メソッドがあります

  • キーに基づいて対応する値を見つけるための検索メソッドがあります

  • 初期化

    #- ハッシュ テーブルにあるスロットの数を初期化します
  • - 配列を使用して M スロットを作成します
    class HashTable {
        constructor(num=1000){
            this.M = num;
            this.slots = new Array(num);
        }
    }
ログイン後にコピー

ハッシュ関数

ハッシュ関数文字列の処理では、値を文字列に転送することもできるため、ここでは文字列が使用されます。

まず、より厳密にするために、渡されたキー値を文字列に変換します。 ##文字列は配列です (例: 'abc' => [...'abc'] => ['a','b','c']

charCodeAt を計算します。各キャラクターの残りを個別に取得する目的は、スロットの数に正確に対応することです。スロットは合計 10 個しかなく、あなたの値は必ず 0 ~ 9

    h(str){
        str = str + '';
        return [...str].reduce((hash,c)=>{
            hash = (331 * hash + c.charCodeAt()) % this.M;
            return hash;
        },0)
    }
ログイン後にコピー
## のスロットに収まります。 #Add

ハッシュ関数を呼び出します。対応するストレージ アドレス (例のスロットです) を取得します。

スロットには複数の値が格納されている可能性があるため、それを表す必要があります。計算したスロット番号が 0 (slot[0]) であるなど、2 次元配列で表すと、後から来るスロットもスロット番号が [0] である場合は、スロット [0] に格納する必要があります。 0 の場合は、slot[0] [1]

    add(key,value) {
        const h = this.h(key);
        // 判断这个槽是否是一个二维数组, 不是则创建二维数组
        if(!this.slots[h]){
            this.slots[h] = [];
        }
        // 将值添加到对应的槽中
        this.slots[h].push(value);
    }
ログイン後にコピー

Delete

ハッシュ アルゴリズムを通じてスロットを検索

フィルタリングを通じて削除

    delete(key){
        const h = this.h(key);
        this.slots[h] = this.slots[h].filter(item=>item.key!==key);
    }
ログイン後にコピー
## に保存する必要があります。 #Find

ハッシュ アルゴリズムを通じて対応するスロットを検索します。

検索関数を使用して同じキーの値を検索します。

対応する値を返します

    search(key){
        const h = this.h(key);
        const list = this.slots[h];
        const data = list.find(x=> x.key === key);
        return data ? data.value : null;    
    }
ログイン後にコピー

总结

讲到这里,散列表的数据结构已经讲完了,其实我们每学一种数据结构或算法的时候,不是去照搬实现的代码,我们要学到的是思想,比如说散列表它究竟做了什么,它是一种存储方式,可以快速的通过键去查找到对应的值。那么我们会思考,如果我们设计的槽少了,在同一个槽里存放了大量的数据,那么这个散列表它的搜索速度肯定是会大打折扣的,这种情况又应该用什么方式去解决,又或者是否用其他的数据结构的代替它。

补充一个小知识点

v8引擎中的数组 arr = [1,2,3,4,5] 或 new Array(100) 我们都知道它是开辟了一块连续的空间去存储,而arr = [] , arr[100000] = 10 这样的操作它是使用的散列,因为这种操作如果连续开辟100万个空间去存储一个值,那么显然是在浪费空间。


以上がJavaScript のハッシュ テーブル (ハッシュ テーブル) の詳細な紹介 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java 関数比較を使用して複雑なデータ構造を比較する Java 関数比較を使用して複雑なデータ構造を比較する Apr 19, 2024 pm 10:24 PM

Java で複雑なデータ構造を使用する場合、Comparator を使用して柔軟な比較メカニズムを提供します。具体的な手順には、コンパレータ クラスの定義、比較ロジックを定義するための比較メソッドの書き換えが含まれます。コンパレータインスタンスを作成します。 Collections.sort メソッドを使用して、コレクションとコンパレータのインスタンスを渡します。

Javaのデータ構造とアルゴリズム: 詳細な説明 Javaのデータ構造とアルゴリズム: 詳細な説明 May 08, 2024 pm 10:12 PM

データ構造とアルゴリズムは Java 開発の基礎です。この記事では、Java の主要なデータ構造 (配列、リンク リスト、ツリーなど) とアルゴリズム (並べ替え、検索、グラフ アルゴリズムなど) について詳しく説明します。これらの構造は、スコアを保存するための配列、買い物リストを管理するためのリンク リスト、再帰を実装するためのスタック、スレッドを同期するためのキュー、高速検索と認証のためのツリーとハッシュ テーブルの使用など、実際の例を通じて説明されています。これらの概念を理解すると、効率的で保守しやすい Java コードを作成できるようになります。

Go 言語の参照型についての深い理解 Go 言語の参照型についての深い理解 Feb 21, 2024 pm 11:36 PM

参照型は Go 言語の特別なデータ型であり、その値にはデータそのものが直接格納されるのではなく、格納されたデータのアドレスが格納されます。 Go 言語では、参照型にはスライス、マップ、チャネル、ポインターが含まれます。 Go 言語のメモリ管理とデータ転送方法を理解するには、参照型を深く理解することが重要です。この記事では具体的なコード例を組み合わせて、Go言語における参照型の特徴と使い方を紹介します。 1. スライス スライスは、Go 言語で最も一般的に使用される参照型の 1 つです。

PHP データ構造: AVL ツリーのバランス、効率的で秩序あるデータ構造の維持 PHP データ構造: AVL ツリーのバランス、効率的で秩序あるデータ構造の維持 Jun 03, 2024 am 09:58 AM

AVL ツリーは、高速かつ効率的なデータ操作を保証するバランスのとれた二分探索ツリーです。バランスを達成するために、左回転と右回転の操作を実行し、バランスに反するサブツリーを調整します。 AVL ツリーは高さバランシングを利用して、ツリーの高さがノード数に対して常に小さくなるようにすることで、対数時間計算量 (O(logn)) の検索操作を実現し、大規模なデータ セットでもデータ構造の効率を維持します。

Java コレクション フレームワークの完全分析: データ構造を分析し、効率的なストレージの秘密を明らかにする Java コレクション フレームワークの完全分析: データ構造を分析し、効率的なストレージの秘密を明らかにする Feb 23, 2024 am 10:49 AM

Java コレクション フレームワークの概要 Java コレクション フレームワークは Java プログラミング言語の重要な部分であり、データを保存および管理できる一連のコンテナ クラス ライブラリを提供します。これらのコンテナ クラス ライブラリには、さまざまなシナリオでのデータ ストレージと処理のニーズを満たすために、さまざまなデータ構造があります。コレクション フレームワークの利点は、統一されたインターフェイスが提供され、開発者が異なるコンテナ クラス ライブラリを同じ方法で操作できるため、開発の困難さが軽減されることです。 Java コレクション フレームワークのデータ構造 Java コレクション フレームワークにはさまざまなデータ構造が含まれており、それぞれに独自の特性と適用可能なシナリオがあります。以下に、一般的な Java コレクション フレームワークのデータ構造をいくつか示します。 1. リスト: リストは、要素を繰り返すことができる順序付けされたコレクションです。李

JSのAI時代が到来! JSのAI時代が到来! Apr 08, 2024 am 09:10 AM

JS-Torch の概要 JS-Torch は、構文が PyTorch に非常に似ている深層学習 JavaScript ライブラリです。これには、完全に機能するテンソル オブジェクト (追跡された勾配で使用可能)、深層学習レイヤーと関数、および自動微分エンジンが含まれています。 JS-Torch は JavaScript での深層学習の研究に適しており、深層学習の開発を加速するための便利なツールや機能を多数提供します。 Image PyTorch は、Meta の研究チームによって開発および保守されているオープンソースの深層学習フレームワークです。ニューラル ネットワーク モデルを構築およびトレーニングするための豊富なツールとライブラリのセットを提供します。 PyTorch は、シンプル、柔軟、そして使いやすいように設計されており、その動的な計算グラフ機能により、

バックエンド開発における Golang と Node.js の比較 バックエンド開発における Golang と Node.js の比較 Jun 03, 2024 pm 02:31 PM

Go と Node.js には、型指定 (強い/弱い)、同時実行性 (ゴルーチン/イベント ループ)、ガベージ コレクション (自動/手動) の違いがあります。 Go は高スループットと低レイテンシーを備えており、高負荷のバックエンドに適しています。Node.js は非同期 I/O に優れており、高い同時実行性と短いリクエストに適しています。この 2 つの実際のケースには、Kubernetes (Go)、データベース接続 (Node.js)、Web アプリケーション (Go/Node.js) が含まれます。最終的な選択は、アプリケーションのニーズ、チームのスキル、個人の好みによって異なります。

ハッシュ テーブル ベースのデータ構造により、PHP 配列の論理積と和集合の計算が最適化されます。 ハッシュ テーブル ベースのデータ構造により、PHP 配列の論理積と和集合の計算が最適化されます。 May 02, 2024 pm 12:06 PM

ハッシュ テーブルを使用すると、PHP 配列の交差と和集合の計算を最適化し、時間の複雑さを O(n*m) から O(n+m) に減らすことができます。 具体的な手順は次のとおりです。 ハッシュ テーブルを使用して要素をマップします。最初の配列をブール値に変換すると、2 番目の配列の要素が存在するかどうかがすぐにわかり、交差計算の効率が向上します。ハッシュ テーブルを使用して最初の配列の要素を既存としてマークし、次に 2 番目の配列の要素を 1 つずつ追加し、既存の要素を無視して共用体計算の効率を向上させます。

See all articles