zoukankan      html  css  js  c++  java
  • 哈希表

    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
    给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
    一、直接寻址法
    当关键字的全域比较小时,直接寻址是一种简单而有效的方法。通过键直接找到值。

    直接寻址技术缺点:
    当域U很大时,需要消耗大量内存,很不实际
    如果域U很大而实际出现的key很少,则大量空间被浪费
    无法处理关键字不是数字的情况。

    二、哈希

    改进直接寻址表:哈希(Hashing)
    构建大小为m的寻址表T,
    key为k的元素放到h(k)位置上,
    h(k)是一个函数,其将域U映射到表T[0,1,...,m-1]。

    三、哈希表

    哈希表(Hash Table,又称为散列表),是一种线性表的存储结构。哈希表由一个直接寻址表和一个哈希函数组成。

    哈希函数h(k)将元素关键字k作为自变量,返回元素的存储下标。
    简单哈希函数:
    除法哈希:h(k) = k mod m
    乘法哈希:h(k) = floor(m(kA mod 1)) 0<A<1
    假设有一个长度为7的数组,哈希函数h(k)=k mod 7。元素集合{14,22,3,5}的存储方式如下图。

    四、哈希冲突

    由于哈希表的大小是有限的,而要存储的值的总数量是无限的,因此对于任何哈希函数,都会出现两个不同元素映射到同一个位置上的情况,这种情况叫做哈希冲突。
    比如:h(k)=k mod 7, h(0)=h(7)=h(14)=...

    五、解决哈希冲突的方法——开放寻址法

    开放寻址法:如果哈希函数返回的位置已经有值,则可以向后探查新的位置来存储这个值。
    线性探查:如果位置i被占用,则探查i+1, i+2,……
    二次探查:如果位置i被占用,则探查i+12,i-12,i+22,i-22,……
    二度哈希:有n个哈希函数,当使用第1个哈希函数h1发生冲突时,则尝试使用h2,h3,……

    六、解决哈希冲突的方法——拉链法

    拉链法:哈希表每个位置都连接一个链表,当冲突发生时,冲突的元素将被加到该位置链表的最后。

    结束!

  • 相关阅读:
    当Django模型迁移时,报No migrations to apply 问题时
    django--各个文件的含义
    django--创建项目
    1013. Battle Over Cities (25)
    1011. World Cup Betting (20)
    1009. Product of Polynomials (25)
    1007. Maximum Subsequence Sum (25)
    1006. Sign In and Sign Out (25)
    1008. Elevator (20)
    1004. Counting Leaves (30)
  • 原文地址:https://www.cnblogs.com/aaronthon/p/13655139.html
Copyright © 2011-2022 走看看