散列表(hash表)

1. hash表:
        又称散列表,以key-value的形式存储数据,能够由key快速定位到其指定的value,而不经过查找。它采用了函数式的映射思想,将记录的存储位置与关键词相关联,从而快速定位进行查找,复杂度为O(1)。
 
2. hash函数:
  •  key和value的映射关系称为HASH函数,通过该函数可以计算key所对应的存储位置(表中存储位置,不是实际物理地址),即HASH地址。
  •  构造HASH地址的方法有:
            (1)直接定址法:取关键词或关键词的某个线性函数为hash地址。
            (2)平方取中法:关键词的平方取中间某几个数构成hash地址。
            (3)折叠法:将关键词拆分成几部分,然后以特定方式组合构成hash地址。
  • 避免hash地址发生冲突的解决办法:
              (1)开放定址法:当一个关键字和另一个关键字发生冲突时,使用某种探测技术在Hash表中形成一个探测序列,然后沿着这个探测序列依次查找下去,当碰到一个空的单元时,则插入其中。
              (2)链地址法:采用数组和链表相结合的办法,将Hash地址相同的记录存储在一张线性表中,而每张表的表头的序号即为计算得到的Hash地址。
                          
3. HASH表的优缺点:
          优点:O(1)时间复杂度进行查找,删除和插入操作容易。
          缺点:不能排序,占用空间大,记录的关键词不能重复。
 
4.常用hash函数:
/*    除余法哈希函数( 不适用于表很大的情况 )  */
int hash(const std::string & key,int tablesize)
{
    int hashvalue = 0;
    for(unsigned int i=0;i<key.length();++i)
        hashvalue += key[i];
    return hashvalue % tablesize;
}

/*   RS哈希函数  */
int RSHash(const std::string & str)  
{  
    int b  = 378551;  
    int a  = 63689;  
    int hash = 0;  
    for(unsigned int i = 0; i < str.length(); i++)  
    {  
            hash = hash * a + str[i];  
            a  = a * b;  
    }  
    return hash;  
}  
原文地址:https://www.cnblogs.com/ladawn/p/8450242.html