1. 程式人生 > >Javascript之資料結構與演算法的HashMap實現

Javascript之資料結構與演算法的HashMap實現

Javascript之資料結構與演算法的HashMap實現

1.自實現HashMap

let LinkedList=require("./LinkedList")
let loseloseHashCode=Symbol();
class HashMap{
    constructor(){
        this.table=[];
        this[loseloseHashCode]=function(key){//雜湊函式
            let hash=0;
            for
(let i=0;i<key.length;i++){ hash+=key.charCodeAt(i);//字元對應的asc碼值 } return hash%37; };//私有函式 this[djb2HashCode]=function(key){//優化版雜湊函式 let hash=5381; for(let i=0;i<key.length;i++){ hash=hash*33+key.charCodeAt
(i); } return hash%1013; } } //分離連結法 put(key,value){ let position=this[loseloseHashCode](key); if(this.table[position]==undefined){ this.table[position]=new LinkedList(); this.table[position].append(new ValuePair
(key,value)); }else if(this.table[position]!=undefined){ let hasKey=false; let current=this.table[position].getHead(); if(current.element.key==key){ hasKey=true; } while(current.next){//判斷放入的key值是否已經存在,非position值即hash值。 if(current.element.key==key){ haskey=true; break; } current=current.next; } if(hasKey==false){ this.table[position].append(new ValuePair(key,value)); }else{ console.log("有重複的key值,不能再次放入") } } } //線性探查 put_1(key,value){ let position=this[loseloseHashCode](key); if(this.table[position]==undefined){ console.log("該位置無元素") this.table[position]=new ValuePair(key,value); }else{ console.log("該位置有元素") let hasKey=false; if(this.table[position].key==key){ hasKey=true; } if(hasKey==false){//防止放入相同key值的值,非position var index=++position; while(this.table[index]!=undefined){ if(this.table[index].key==key){ hasKey=true; } index++; } if(hasKey==false){ this.table[index]=new ValuePair(key,value); } } } } //分離連結法 get(key){ var position=this[loseloseHashCode](key); if(this.table[position]!=undefined){ let current=this.table[position].getHead(); if(current.element.key==key){ return current.element.value; } while(current.next){ if(current.element.key==key){ return current.element.value; } current=current.next; } } return undefined; } //線性探查 get_1(key){ let position=this[loseloseHashCode](key); if(this.table[position]!==undefined){ if(this.table[position].key==key){ return this.table[position].value; }else{ let index=++position; while(this.table[index]==undefined||this.table[index].key!=key){ index++; } if(this.table[index].key==key){ return this.table[index].value; } } } return undefined; } //分離連結法 remove(key){ let position=this[loseloseHashCode](key); if(this.table[position]!==undefined){ let current=this.table[position].getHead(); if(current.element.key==key){//判斷第一個位置是否為匹配的值 this.table[position].remove(current.element); if(this.table[position].isEmpty()){ this.table[position]=undefined; } return true; } while(current.next){ if(current.element.key==key){ this.table[position].remove(current.element); if(this.table[position].isEmpty()){ this.table[position]=undefined; } return true; } current=current.next; } } return false; } //線性探查 remove_1(key){ let position=this[loseloseHashCode](key); if(this.table[position]!==undefined){ if(this.table[position].key==key){ this.table[index]=undefined; }else{ let index=++position; while(this.table[index]==undefined||this.table[index].key!=key){ index++; } if(this.table[index].key==key){ this.table[index]=undefined; } } } } getAll(){ return this.table } } //----------------------------雜湊衝突--------------------- //1.分離連結 class ValuePair{//連結串列每一個元素存入的值為ValuePair物件 constructor(key,value){ this.key=key; this.value=value; } toString(){ return '['+this.key+'-'+this.value+']'; } } let hash=new HashMap(); hash.put_1('Gandalf','[email protected]'); hash.put_1('Gandalf','[email protected]'); hash.put_1('Gandalf','mail.com'); console.log(hash.get_1('Gandalf')); console.log(hash.get_1('ll')) console.log(hash.getAll())

注:其中LinkedList使用的是[https://blog.csdn.net/wushichao0325/article/details/84973099]中實現的LinkedList。