javascript hash 函數


//設計哈希函數
//1>將字符串轉成比較大的數字:hashCode
//2>將大的數字hashCode壓縮到數組范圍

    function hashFunc(str,size){
         //1.定義hashCode變量
         var hashCode=0

         //2.霍納算法,來計算 hashCode的值
         for(var i=0;i<str.length;i++){
            hashCode=37* hashCode + str.charCodeAt(i) //獲取編碼
         }
         //3.取余狀態
         var index=hashCode%size

         return index 
     }

     //測試哈希函數
     alert(hashFunc('abc',7))
     alert(hashFunc('cba',7))
     alert(hashFunc('nba',7))
     alert(hashFunc('mba',7))


 function HashTable(){
         //屬性
        this.storage=[]
        this.count=0
        this.limit=7

       
         //方法
         //哈希函數
         HashTable.prototype.hashFunc= function (str,size){
            //1.定義hashCode變量
            var hashCode=0

            //2.霍納算法,來計算 hashCode的值
            for(var i=0;i<str.length;i++){
                hashCode=37* hashCode + str.charCodeAt(i) //獲取編碼
            }
            //3.取余狀態
            var index=hashCode%size

            return index  
        } 

        //插入和修改操作
       HashTable.prototype.put= function (key,value){
            //1。根據key 獲取對應的 index
            var index=this.hashFunc(key,this.limit)

            //2.根據 index取出對應的bucket
            var bucket=this.storage[index]

            //3.判斷bucket 是否為 null
            if(bucket==null){
                bucket=[]
                this.storage[index]=bucket
            }

            //4.判斷是否是修改數據
            for(var i=0;i<bucket.length;i++){
                var tuple=bucket[i]
                if(tuple[0]==key){
                    tuple[1]=value
                    return 
                }
            }

            //5.進行添加操作
            bucket.push([key,value])
            this.count+=1

            //6.判斷是否需要擴容操作
            if(this.count>this.limit*0.75){
                this.resize(this.limit*2)
            }
        }

        //獲取操作
       HashTable.prototype.get=function(key){
          //1.根據 key獲取對應的 index
          var index=this.hashFunc(key,this.limit)

          //2.根據 index獲取對應的 bucket
          var bucket=this.storage[index]

          //3.判斷bucket是否為 null
          if(bucket===null){
              return null
          }   

          //4.有 bucket,那么進行線性查找
          for(var i=0;i<bucket.length;i++){
              var tuple=bucket[i]
              if(tuple[0]===key){
                  return tuple[1]
              }
          }

          //依然沒有找到,那么返回 null
          return null 
       }
       
       //刪除操作
       HashTable.prototype.remove=function(key){
           //1.根據 key 獲取對應的index
           var index=this.hashFunc(key,this.limit)

           //2.根據index 獲取對應的bucket
           var bucket=this.storage[index]

           //3.判斷bucket 是否為 null
           if(bucket===null) return null

           //4.有 bucket,那么進行線性查找,並且刪除
           for(var i=0;i<bucket.length;i++){
               var tuple=bucket[i]
               if(tuple[0]===key){
                   bucket.splice(i,1)
                   this.count--
                   return tuple[1]

                   // 縮小容量
                   if(this.limit>7&&this.count<this.length*0.25){
                       this.resize(Math.floor(this.limit/2))
                   }
               }
           }

           //5.依然沒有找到,return null
           return null
       }

       //其他方法
       //判斷 hash 表是否為null
       HashTable.prototype.isEmpty=function(){
           return this.count==0
       }
       
       //獲取哈希表中的個數
       HashTable.prototype.size=function(){
           return this.count
       }

       //哈希表的擴容
       HashTable.prototype.resize=function(newLimit){
           //1.保存舊的數組內容
           var oldStorage=this.storage

           //2.重置所有的屬性
           this.storage=[]
           this.count=0
           this.limit=newLimit
           
           //3.遍歷oldStorage中所有的bucket
           for(var i=0;i<oldStorage.length;i++){
               //3.1取出對應的bucket
               var backet=oldStorage[i]

               //3.2判斷 bucket是否為 null
               if(bucket==null) continue

               //3.3bucket 中有數據,取出數據,重新插入
               for(var j=0;j<bucket.length;j++){
                   var tuple=bucket[j]
                   this.put(tuple[0],tuple[1])
               }
           }

       }
    }
 
   
    
    //測試 hansh 表
    var ht=new HashTable()

    //2.插入數據
    ht.put('abc','123')
    ht.put('cba','321')
    ht.put('nba','521')
    ht.put('mba','520')

    //3.獲取方法
    alert(ht.get('abc'))

    //4.修改方法
    ht.put('abc','111')
    alert(ht.get('abc'))

    //5.刪除方法
    ht.remove('abc')
    alert(ht.get('abc'))

//封裝一個函數:判斷傳入的函數是否是質數
     //特點:只能被 1和自己整數,不能被 2到n-1之間的數字整除
     function isPrime(num){
        for(var i=2;i<num;i++){
            if(num%i==0) return false
        }
        return true
     }

     function isPrime2(){
         //1.獲取 num的平方根
         var temp=parseInt(Math.sqrt(num))
         //2.循環判斷
         for(var i=0;i<temp;i++){
           if(num%i==0) return false
         }
         return true
     }
     //驗證函數
     alert(isPrime(3))
     alert(isPrime(11))
     alert(isPrime(123))
     alert(isPrime(41))


 function HashTable(){
         //屬性
        this.storage=[]
        this.count=0
        this.limit=7

       
         //方法
         //哈希函數
         HashTable.prototype.hashFunc= function (str,size){
            //1.定義hashCode變量
            var hashCode=0

            //2.霍納算法,來計算 hashCode的值
            for(var i=0;i<str.length;i++){
                hashCode=37* hashCode + str.charCodeAt(i) //獲取編碼
            }
            //3.取余狀態
            var index=hashCode%size

            return index  
        } 

        //插入和修改操作
       HashTable.prototype.put= function (key,value){
            //1。根據key 獲取對應的 index
            var index=this.hashFunc(key,this.limit)

            //2.根據 index取出對應的bucket
            var bucket=this.storage[index]

            //3.判斷bucket 是否為 null
            if(bucket==null){
                bucket=[]
                this.storage[index]=bucket
            }

            //4.判斷是否是修改數據
            for(var i=0;i<bucket.length;i++){
                var tuple=bucket[i]
                if(tuple[0]==key){
                    tuple[1]=value
                    return 
                }
            }

            //5.進行添加操作
            bucket.push([key,value])
            this.count+=1

            //6.判斷是否需要擴容操作
            if(this.count>this.limit*0.75){
                var newSize=this.limit*2
                var newPrime=this.getPrime(newPrime)
                this.resize(this.limit*2)
            }
        }

        //獲取操作
       HashTable.prototype.get=function(key){
          //1.根據 key獲取對應的 index
          var index=this.hashFunc(key,this.limit)

          //2.根據 index獲取對應的 bucket
          var bucket=this.storage[index]

          //3.判斷bucket是否為 null
          if(bucket===null){
              return null
          }   

          //4.有 bucket,那么進行線性查找
          for(var i=0;i<bucket.length;i++){
              var tuple=bucket[i]
              if(tuple[0]===key){
                  return tuple[1]
              }
          }

          //依然沒有找到,那么返回 null
          return null 
       }
       
       //刪除操作
       HashTable.prototype.remove=function(key){
           //1.根據 key 獲取對應的index
           var index=this.hashFunc(key,this.limit)

           //2.根據index 獲取對應的bucket
           var bucket=this.storage[index]

           //3.判斷bucket 是否為 null
           if(bucket===null) return null

           //4.有 bucket,那么進行線性查找,並且刪除
           for(var i=0;i<bucket.length;i++){
               var tuple=bucket[i]
               if(tuple[0]===key){
                   bucket.splice(i,1)
                   this.count--
                   return tuple[1]

                   // 縮小容量
                   if(this.limit>7&&this.count<this.length*0.25){
                       var newSize=Math.floor(this.limit /2)
                       var newPrime=this.getPrime(newSize)
                       this.resize(newPrime)
                   }
               }
           }

           //5.依然沒有找到,return null
           return null
       }

       //其他方法
       //判斷 hash 表是否為null
       HashTable.prototype.isEmpty=function(){
           return this.count==0
       }
       
       //獲取哈希表中的個數
       HashTable.prototype.size=function(){
           return this.count
       }

       //哈希表的擴容
       HashTable.prototype.resize=function(newLimit){
           //1.保存舊的數組內容
           var oldStorage=this.storage

           //2.重置所有的屬性
           this.storage=[]
           this.count=0
           this.limit=newLimit
           
           //3.遍歷oldStorage中所有的bucket
           for(var i=0;i<oldStorage.length;i++){
               //3.1取出對應的bucket
               var backet=oldStorage[i]

               //3.2判斷 bucket是否為 null
               if(bucket==null) continue

               //3.3bucket 中有數據,取出數據,重新插入
               for(var j=0;j<bucket.length;j++){
                   var tuple=bucket[j]
                   this.put(tuple[0],tuple[1])
               }
           }

       }
    
       //判斷某個數字是否是質數
       HashTable.prototype.isPrime=function(num){
        var temp=parseInt(Math.sqrt(num))
         //2.循環判斷
         for(var i=0;i<temp;i++){
           if(num%i==0) return false
         }
         return true
       }

       //獲取質數的方法
       HashTable.prototype.getPrime=function(num){
           while(!this.isPrime(num)){
               num++
           }
           return num
       }
    }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM