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 Remove 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 + ']'; } }; }
충돌을 해결하는 또 다른 방법은 선형 프로빙입니다. 테이블의 특정 위치에 새 요소를 추가하고 싶을 때, 인덱스
위치가 이미 사용 중이라면 인덱스+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 + ']'; } }; }
우리가 구현한 "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 중국어 웹사이트의 기타 관련 기사를 참조하세요!