zoukankan      html  css  js  c++  java
  • 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
           }
        }
    

      

  • 相关阅读:
    Wijmo 更优美的jQuery UI部件集:在对Wijmo GridView进行排序或者过滤时保留选择
    Wijmo 更优美的jQuery UI部件集:活动日历控件(Event Calendar)
    Wijmo 更优美的jQuery UI部件集:导出Wijmo的GridView到Excel
    Wijmo 更优美的jQuery UI部件集:服务器端Grid魔法
    Wijmo 更优美的jQuery UI部件集:在安全站点使用Wijmo控件
    Wijmo 更优美的jQuery UI部件集:复合图表(CompositeChart)
    Wijmo 更优美的jQuery UI部件集:C1 Wijmo Grids 更多惊喜
    Hello Metro:Windows 8下首个App
    Wijmo 更优美的jQuery UI部件集:运行时处理Wijmo GridView数据操作
    Wijmo 更优美的jQuery UI部件集:自定义 C1WijMenu
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/13909510.html
Copyright © 2011-2022 走看看