Hash Table

1.Hash functions

  • 直接定址法:h(k)=ak+b.
  • 数字分析法
  • 平方取中法:去关键字平方后的中间几位为hash address.
  • 折叠法:将关键字分割成位数相同的几部分(最后一部分位数可以不同),然后取这几部分的叠加(去掉进位)和作为hash address.
  • 除留余数法:h(k)=k mod m, m<=Table.length.一般情况下,取m为质数或不包含小于20的质因数的合数。
  • 随机数法:h(k)=random(k), 当关键字长度不同时采用此法较恰当。
  • 乘法散列法(multiplication method):h(k)= [m(kA mod 1)], m=2p, A≈(√5 - 1)/2 (best).
  • 全域散列法(universal hashing):从一组精心设计的functions中随机的选择hash function.

2.解决冲突的方法

  • 再Hash法:关键字产生冲突时,再用其它不同的hash function再计算一次地址。
  • 链接法:将所有关键字为同义词的元素放在同一个线性链表中。
  • 开放寻址法:
    • 线性探测:h(k,i)=(h‘(k)+i) mod m, i=0,1,...,m-1.存在primary clusting问题。(群集的意思是元素连续存储,会导致平均查找时间变长)
    • 二次探测:h(k,i)=(h‘(k)+c*i+d*i2) mod m, i=0,1,...,m-1.存在secondary clusting问题,程度较轻。
    • 双重散列(double hashing):h(k,i)=(h1(k)+i*h2(k)) mod m, i=0,1,...,m-1.为了能查找整个散列表,值h2(k)必须与m互素。
      • 方案一:m取2的幂,并设计一个总产生奇数h2。
      • 方案二:m为素数,并设计一个总是返回较m小的正整数的函数h2。
  • 建立一个公共溢出区:一旦发生冲突,都填入溢出表。

3.完全散列(perfect hashing)

采用两级的散列方法来设计散列方案,每一级上都采用全域散列。适用于关键字集合是静态的情况,即关键字一旦存入表中,关键字集合就不再改变。如程序设计语言中保留字的集合,CD—ROM上的文件名的集合。

4.采用开放寻址法的散列表中的删除操作

删除关键字时,不能仅仅将该位置置空(NIL),比如两个关键字的hash值相同时,那么第二个关键字就要往后移,这种情况下删除第一个关键字将会导致第二个关键字无法被检索到。一个解决方法是用特定的值DELETED来标记该位置。在必须删除关键字的应用中,更常见的做法是采用链接法来解决冲突。(python中字典是通过散列表实现,用开放寻址法解决冲突,搜索的时间复杂度为T(n)=O(1);c++的STL通过红黑树实现,搜索的时间复杂度T(n)=O(lgn),SGI的STL通过链接法解决冲突。)

5.时间复杂度

搜索、插入、删除的时间复杂度:T(n)=O(1).

时间: 2024-10-29 20:22:45

Hash Table的相关文章

PHP内核探索之变量(3)- hash table

在PHP中,除了zval, 另一个比较重要的数据结构非hash table莫属,例如我们最常见的数组,在底层便是hash table.除了数组,在线程安全(TSRM).GC.资源管理.Global变量.ini配置管理中,几乎都有Hash table的踪迹(上一次我们也提到,符号表也是使用Hash table实现的).那么,在PHP中,这种数据有什么特殊之处,结构是怎么实现的? 带着这些问题,我们开始本次的内核探索之旅. 本文主要内容: Hash table的基本介绍 PHP底层Hash tabl

stl源码分析之hash table

本文主要分析g++ stl中哈希表的实现方法.stl中,除了以红黑树为底层存储结构的map和set,还有用哈希表实现的hash_map和hash_set.map和set的查询时间是对数级的,而hash_map和hash_set更快,可以达到常数级,不过哈希表需要更多内存空间,属于以空间换时间的用法,而且选择一个好的哈希函数也不那么容易. 一. 哈希表基本概念 哈希表,又名散列表,是根据关键字直接访问内存的数据结构.通过哈希函数,将键值映射转换成数组中的位置,就可以在O(1)的时间内访问到数据.举

【string】hash table, two pointers, string

利用hash table, two pointers, string的题目. 1.求最长不重复子串的长度 hash table体现在一个数组,下标是字符串中元素的ASCII值,下标对应的元素代表该元素在字符串中出现的位置. two pointers体现在用i一步步向前移去遍历字符串中的元素,作为不重复子串的末尾位置:用j指向不重复字符区间的首字符的位置. 1 /*************************** 2 @date 4.23 3 @description https://leet

算法导论-散列表(Hash Table)

目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内容 1.引言 如果想在一个n个元素的列表中,查询元素x是否存在于列表中,首先想到的就是从头到尾遍历一遍列表,逐个进行比较,这种方法效率是Θ(n):当然,如果列表是已经排好序的话,可以采用二分查找算法进行查找,这时效率提升到Θ(logn);  本文中,我们介绍散列表(HashTable),能使查找效率

Java 散列表 hash table

Java 散列表 hash table @author ixenos hash table, HashTable, HashMap, HashSet hash table 是一种数据结构 hash table 为每个对象计算一个整数,该整数被称为散列码 hash code hash code 是由对象的实例域产生的一个整数,具有不同的数据域的对象将产生不同的hash code 如果自定义类,就要负责实现这个类的hashCode方法,注意要与equals方法兼容,即如果a.equals(b)为tr

C 语言构造hash table 解 LC majority element问题

Leetcode上 majority element这题是 有 时间O(N), 空间O(1)的解的. https://leetcode.com/problems/majority-element/ 用hash table来解则为 时间O(N), 空间O(N). 如果是Java里 用HashMap很方便了. 有位同学问怎么用c语言来构造hash table. 我就随手写了一个: typedef struct Node { int val, count; } Node; typedef struct

STL hash table, Unordered Contains

STL hash table, Unordered Contain   C++11加入使用hash table实现的Unordered Containers.容器中元素是不排序的,同时我们也不能指定某个元素的位置. 头文件:#include <unordered_set>   unordered_set; unordered_multiset;           #include <unordered_map> unordered_map; unordered_multimap;

算法学习 - Hash Table操作,分离链接法解决哈希冲突

分离链接法 hash table是映射机制的,最大的优点就是它的操作是O(1)级别的.但是会出现哈希冲突,这就需要几种办法来解决.这里先说一种:分离链接法. 就是当插入的位置已经存在一个值之后,那么在这个值之后插入,就可以了,也叫拉链法.(但是其实会降低查找速度,变成O(n)级别) 下面是代码: // // main.cpp // HashTable_SeparateChaining // // Created by Alps on 14-8-5. // Copyright (c) 2014年

[CareerCup] 13.2 Compare Hash Table and STL Map 比较哈希表和Map

13.2 Compare and contrast a hash table and an STL map. How is a hash table implemented? If the number of inputs is small, which data structure options can be used instead of a hash table? 这道题让我们比较哈希表和STL中的map数据结构,在遇到这道题之前,我一直以为map就是c++中的哈希表呢,原来是不同的啊-

散列表(hash table)&mdash;&mdash;算法导论(13)

1. 引言     许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表     在介绍散列表之前,我们前介绍直接寻址表.     当关键字的全域U(关键字的范围)比较小时,直接寻址是一种简单而有效的技术.我们假设某应用要用到一个动态集合,其中每个元素的关键字都是取自于全域U={0,1,-,m-1},其中m不是一个很大的数.另外,假设每个元素的关键字都不同.    为表示动