ホームページ >ウェブフロントエンド >jsチュートリアル >js辞書とハッシュテーブルの例を詳しく解説
js辞書 辞書は要素を[キー、値]の形式で格納します。ディクショナリはマッピングとも呼ばれます。この記事では主に js ディクショナリとハッシュ テーブルの詳細な例を紹介します。
function Dictionary() { var items = {}; this.has = function(key) { return key in items; } this.set = function(key,value){ items[key] = value; } this.remove = function(Key){ if(this.has(Key)){ delete items[Key]; return true; } return false; } this.get = function(key){ return this.has(Key)?items[Key]:undefined; } this.values = function() { var values = {}; for (var k in items) { //{1} if (this.has(k)) { values.push(items[k]); //{2} } } return values; }; this.size = function(){ return Object.keys(items).length; //{4} }; this.sizeLegacy = function(){ var count = 0; for(var prop in items) { //{5} if(items.hasOwnProperty(prop)) //{6} ++count; //{7} } return count; }; this.getItems = function() { return items; } }
ハッシュテーブル
function HashTable() { var table = []; var loseloseHashCode = function (key) { var hash = 0; for(var i = 0;i<key.length;i++){ hash += key.charCodeAt(i); } return hash % 37; } this.put = function(key,value){ var position = this.loseloseHashCode(key); console.log(position + ' - ' + key); table[position] = value; } this.get = function(key){ return table[this.loseloseHashCode(key)]; } this.remove = function(key) { table[loseloseHashCode(key)] = undefined; }; this.print = function() { for (var i = 0; i < table.length; ++i) { //{1} if (table[i] !== undefined) { //{2} console.log(i + ": " + table[i]);//{3} } } }; }
ハッシュ値が同じ場合に競合が発生する
19 - Gandalf HashTable.js:12 29 - John HashTable.js:12 16 - Tyrion HashTable.js:12 16 - Aaron HashTable.js:12 13 - Donnie HashTable.js:12 13 - Ana HashTable.js:12 5 - Jonathan HashTable.js:12 5 - Jamie HashTable.js:12 5 - Sue HashTable.js:12 32 - Mindy HashTable.js:12 32 - Paul HashTable.js:12 10 - Nathan HashTable.js:24 5: sue@email.com HashTable.js:24 10: nathan@email.com HashTable.js:24 13: ana@email.com HashTable.js:24 16: aaron@email.com HashTable.js:24 19: gandalf@email.com HashTable.js:24 29: johnsnow@email.com HashTable.js:24 32: paul@email.com
1.分離リンク
分離リンク方法では、ハッシュテーブル内の各位置のリンクリストを作成し、要素を格納します。それ。これは競合を解決する最も簡単な方法ですが、HashTable インスタンスの外部に追加のストレージが必要になります。 put get replace print' メソッドをオーバーライドする
function HashTable() { var table = []; var loseloseHashCode = function (key) { var hash = 0; for(var i = 0;i<key.length;i++){ hash += key.charCodeAt(i); } return hash % 37; } this.put = function(key,value){ var position = loseloseHashCode(key); //undefined创建链表 if(table[position] == undefined) table[position] = new LinkedList(); //undefined不为空 链表后面加元素 table[position].append(new ValuePair(key,value)); } this.get = function(key){ var position = loseloseHashCode(key); if(table[position] !== undefined ){ var current = table[position].getHead(); while(current.next){ if(current.element.key === key) return current.element.value; current = current.next; } if(current.element.key === key) return current.element.value; } return undefined; } this.remove = function(key) { var position = loseloseHashCode(key); if(table[position] !== undefined){ var current = table[position].getHead(); while(current.next){ if(current.element.key === key){ table[position].remove(current.element); if(table[position].isEmpty()) table[position === undefined] return true; } current = current.next; } if(current.element.key === key){ table[position].remove(current.element); if(table[position].isEmpty()) table[position === undefined] return true; } return true; } return fasle; }; this.print = function() { for (var i = 0; i < table.length; ++i) { //{1} if (table[i] !== undefined) { //{2} var current = table[i].getHead(); while(current.next){ console.info("output",current.element.toString()); current = current.next; } console.info("output",current.element.toString());//{3} } } }; //新增的方法 创建node元素 将key,value放入这个对象 var ValuePair = function(key, value){ this.key = key; this.value = value; console.info('[' + this.key + ' - ' + this.value + ']'); this.toString = function() { return '[' + this.key + ' - ' + this.value + ']'; } }; }2. 線形プローブ
競合を解決するもう 1 つの方法は、線形プローブです。テーブル内の特定の位置に新しい要素を追加したい場合、インデックス
の位置が既に占有されている場合は、インデックス +1 の位置を試してください。 Index+1 の位置も占有されている場合は、
index+2 の位置も試してください
function HashTable() { var table = []; var loseloseHashCode = function (key) { var hash = 0; for(var i = 0;i<key.length;i++){ hash += key.charCodeAt(i); } return hash % 37; } this.put = function(key,value){ var position = loseloseHashCode(key); if(table[position] == undefined){ table[position] = new ValuePair(key,value); }esle{ var index = position; while(table[index] !== undefined){ index++; } table[index] = new ValuePair(key,value); } } this.get = function(key){ var position = loseloseHashCode(key); if(table[position] !== undefined ){ if(table[position].key === key){ return table[position].value; }else{ var index =++position; while(table[index]===undefined||table[index].key!==key){ index++ } if(table[index].key===key){ return table[index].value; } } } return undefined; } this.remove = function(key) { var position = loseloseHashCode(key); if(table[position] !== undefined ){ if(table[position].key === key){ table[position] = undefined; return true; }else{ var index =++position; while(table[index]===undefined||table[index].key!==key){ index++ } if(table[index].key===key){ table[position] = undefined; return true; } } } return false; }; this.print = function() { for (var i = 0; i < table.length; ++i) { //{1} if (table[i] !== undefined) { //{2} console.info("output",table[i].toString()); } } }; //新增的方法 创建node元素 将key,value放入这个对象 var ValuePair = function(key, value){ this.key = key; this.value = value; console.info('[' + this.key + ' - ' + this.value + ']'); this.toString = function() { return '[' + this.key + ' - ' + this.value + ']'; } }; }3. より良いハッシュ関数を作成します
私たちが実装した「lose loss」ハッシュ関数は、ハッシュ関数ではありません。これは衝突が多すぎるため、パフォーマンスが良好です。この機能を使用すると、さまざまな競合が発生します。優れたパフォーマンスのハッシュ関数は、要素の挿入と取得にかかる時間 (つまりパフォーマンス)、そしてもちろん衝突の可能性が低いといういくつかの側面で構成されています。いくつかの異なる実装方法をオンラインで見つけることができます
、または独自のハッシュ関数を実装することもできますfunction HashTable() { var table = []; var loseloseHashCode = function (key) { var hash = 5381; for(var i = 0;i<key.length;i++){ hash += hash*33+key.charCodeAt(i); } return hash % 1013; } this.put = function(key,value){ var position = loseloseHashCode(key); table[position] = new ValuePair(key,value); } this.get = function(key){ var position = loseloseHashCode(key); if(table[position] !== undefined ) return table[position].value; return undefined; } this.remove = function(key) { var position = loseloseHashCode(key); if(table[position] !== undefined ){ table[position] = undefined; return true; } return false; }; this.print = function() { for (var i = 0; i < table.length; ++i) { //{1} if (table[i] !== undefined) { //{2} console.info("output",table[i].toString()); } } }; //新增的方法 创建node元素 将key,value放入这个对象 var ValuePair = function(key, value){ this.key = key; this.value = value; console.info('[' + this.key + ' - ' + this.value + ']'); this.toString = function() { return '[' + this.key + ' - ' + this.value + ']'; } }; }
以上がjs辞書とハッシュテーブルの例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。