zoukankan      html  css  js  c++  java
  • HashTable 及应用

    HashTable-散列表/哈希表,是根据关键字(key)而直接访问在内存存储位置的数据结构。 它通过一个关键值的函数将所需的数据映射到表中的位置来访问数据,这个映射函数叫做散列函数,存放记录的数组叫做散列表。


    构造哈希表的几种方法
    1. 直接定址法--取关键字的某个线性函数为散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B为常数。

    2. 除留余数法--取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址。Hash(Key)= Key % P。

    3. 平方取中法

    4. 折叠法

    5. 随机数法

    6. 数学分析法



    哈希冲突/哈希碰撞
    不同的Key值经过哈希函数Hash(Key)处理以后可能产生相同的值哈希地址,我们称这种情况为哈希冲突。任意的散列函数都不能避免产 生冲突。

    处理哈希冲突的闭散列方法:
    1. 线性探测

    2. 二次探测

    处理哈希冲突的开链法(哈希桶):

     

    素数表(使用素数做除数可以减少哈希冲突) // 使用素数表对齐做哈希表的容量,降低哈希冲突 

    // 使用素数表对齐做哈希表的容量,降低哈希冲突     
    const int _PrimeSize = 28;     
    static const unsigned long _PrimeList [_PrimeSize] =   
    {        
      53ul,         97ul,         193ul,       389ul,       769ul,    
      
    1543ul, 3079ul, 6151ul, 12289ul, 24593ul,

      49157ul, 98317ul, 196613ul, 393241ul, 786433ul,

      1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul,

      50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,

      1610612741ul, 3221225473ul, 4294967291ul };


    字符串哈希算法
    http://www.cnblogs.com/-clq/archive/2012/05/31/2528153.html

    哈希表的应用之布隆过滤器

    当一个元素被加入集合时,通过 KHash 函数将这个元素映射成一个位阵列(Bit array)中的 K 个点,把它们置为 1。检索时,我们只要看看这些点是不是都是 1 就知道集合中有没有它了:

    如果这些点有任何一个 0,则被检索元素一定不在

    如果都是 1,则被检索元素很可能在。

    布隆过滤器的博文:

    https://segmentfault.com/a/1190000002729689

    http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html

    相应的源代码请点击:https://github.com/shihaokiss

  • 相关阅读:
    Docker和K8S
    CoBot 库博源代码缺陷检测工具
    Hobot软件成分分析平台
    Black duck(黑鸭子软件)开源代码审计管理测试平台
    python之理解super及MRO列表
    Python中MRO排序原理
    python中with的用法
    使用微服务架构重构支付网关
    支付网关的设计原则
    python内存管理--垃圾回收
  • 原文地址:https://www.cnblogs.com/shihaochangeworld/p/5624078.html
Copyright © 2011-2022 走看看