zoukankan      html  css  js  c++  java
  • 散列表(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;  
    }  
  • 相关阅读:
    (总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解
    一个自动安装LNMP的简洁Shell脚本
    (总结)Nginx配置文件nginx.conf中文详解
    Linux 的启动流程
    Linux运维文档之nginx
    nginx索引目录配置
    nginx实现图片防盗链(referer指令)
    nginx记录分析网站响应慢的请求(ngx_http_log_request_speed)
    C# 使用WinRar命令压缩和解压缩
    localStorage存值取值以及存取JSON,以及基于html5 localStorage的购物车
  • 原文地址:https://www.cnblogs.com/ladawn/p/8450242.html
Copyright © 2011-2022 走看看