美文网首页
200120 散列表(哈希表)

200120 散列表(哈希表)

作者: Ell1ot | 来源:发表于2020-01-20 17:45 被阅读0次

在使用数组的时候,下标作为关键字为我们提供了操作的便捷性,此时关键字是连续的。在需要统计一串数字中每个数字各出现多少次时,若数字取值范围较小,可以这样处理:

int a[11];  //数字取值范围1~10
while(cin>>x)
  a[x]++;

但如果取值范围是1~100000或者更大呢?在数字总数不大的情况下不必建立一个可以储存1000000个整数的数组,而是将有限的关键字(数字)进行散列的储存:

map<int,int>m;
while(cin>>x)
  m[x]++;

map把关键字和实际需要储存的数据进行映射,这样需要的储存空间就小得多。

散列方式

在直接寻址方式下,具有关键字k的元素被存放在槽k中。在散列方式下,该元素在槽h(k)中。h是散列函数,它决定关键字k的槽的位置。但不同的关键字可以由散列函数分配到同一个槽中,造成冲突。解决办法有:
链接法(chaining)把散列在同一个槽中的元素都放在一个链表中,散列表中保存这些链表的头指针。
在进行数据查找、增加、删除等操作时时间复杂度只取决于链表长度,因此若所有关键字都被分配至同一个槽中(最坏情况),时间复杂度为O(n)。但一般情况下操作只需O(1)。
开放寻址法(open addressing)将所有元素直接储存在散列表中。由于元素没有和地址的映射关系,在操作者需要查找某元素时需要检查整个散列表。检查的顺序依赖于探查序列,它是散列函数的扩充。
完全散列(perfect hashing)的查询操作在对坏情况也能达到O(1),十分适合静态储存。它采用两级散列,在最初的散列表中存放数个二次散列表,并且选用合适二次散列表空间防止冲突,选用合适的第一级散列函数使整体储存空间不会过大。

散列函数

散列函数应该使关键字的散列尽可能均匀,使散列值尽可能独立于数据的模式。多数散列函数先将关键字都转化为数字,再进行散列。
除法散列法 取关键字的余数作为结果,需要都除数进行合理设计。
乘法散列法使关键字乘一个常数,取他们乘积的小数部分乘另一个常数,再向下取整。
全域散列法先设定一组散列函数,然后在处理关键字时随机选用函数。无论关键字是怎样的都能保证散列较平均。

相关文章

  • 200120 散列表(哈希表)

    在使用数组的时候,下标作为关键字为我们提供了操作的便捷性,此时关键字是连续的。在需要统计一串数字中每个数字各出现多...

  • 哈希表和链表

    优秀文章:Chapter: 散列表(哈希表) 一、哈希表 哈希表hashtable(key,value) 就是把K...

  • 哈希算法

    什么是哈希算法 了解哈希算法需要了解以下几个概念。 散列表(hash table) 与散列函数 散列表也叫哈希表是...

  • Java数据结构_哈希表_基本概念

    本文目标 哈希表的基本概念,哈希冲突,哈希函数 什么是哈希表 哈希表也叫做散列表(hash有剁碎的意思)哈希表是空...

  • 数据结构-散列表

    1 散列表 散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash 表”,散列表用的就是数...

  • 数据结构与算法(第一季):哈希表(Hash Table)

    一、哈希表(Hash Table) 1、概念 哈希表也叫做散列表。 哈希表的原理: 利用哈希函数生成key对应的i...

  • 数据结构与算法——散列表

    什么是散列表 散列表(hash table),我们平时叫它哈希表或者Hash 表,你肯定经常听到它。 散列表是根据...

  • 算法小专栏:散列表(一)

    本篇将介绍散列表(哈希表)的相关基础知识。 一、简介 散列表(Hash table,也叫哈希表)是根据关键码值(K...

  • 散列表(哈希表)

    散列表(也称哈希表, Hash Table) (在这里, 哈希和散列基本可以混用)是一种根据key:value映射...

  • 哈希表(散列表)

    哈希表的原理: 在已知key的情况下,通过哈希函数f(),在数组中去寻找具体的值f(key)。这里面f()称为哈希...

网友评论

      本文标题:200120 散列表(哈希表)

      本文链接:https://www.haomeiwen.com/subject/ybwjzctx.html