• 散列表(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;  
    }  
  • 相关阅读:
    什么是被 GC Roots 直接引用的对象?
    什么情况下JVM内存中的一个对象会被垃圾回收?
    图解GC流程
    图解JVM内存区域划分
    图解JVM类加载机制和双亲委派模型
    Nginx 是怎么工作的?
    ThreadLocal 线程本地存储
    centos7 配置阿里镜像
    C# 类库项目 无法创建 “资源字典” 文件
    linux 启动jar包 指定yml配置文件和输入日志文件
  • 原文地址:https://www.cnblogs.com/ladawn/p/8450242.html
Copyright © 2020-2023  润新知