Hash Map (Hash Table)
Reference: Wiki PrincetonAlgorithm
What is Hash Table
Hash table (hash map) is a data structure used to implement an associative array, a structure that can map keys to values.
A hash table uses a hash function to compute an index into an array of buckets or slots, from which the desired value can be found.
hash function: transform the search key into an array index
What is Hash Collisions
Different keys that are assigned by the hash function to the same bucket.
Perfect Hashing
A perfect hash function for a set S is a hash function that maps distinct elements in S to a set of integers, with no collisions.
Perfect hashing allows for constant time lookups in the worst case. This is in contrast to most chaining and open addressing methods, where the time for lookup is low on average, but may be very large, O(n), for some sets of keys.
Load Factor
A critical statistic for a hash table.
Load factor = n / k
where:
n = number of entries
k = number of buckets
- high load factor: hash table becomes slower, and it may even fail to work (depending on the method used).
- low load factor: considering the proportion of unused areas in the hash table. This results in wasted memory.
Also, one should examine the variance of number of entries per bucket. For example, two tables both have 1000 entries and 1000 buckets; one has exactly one entry in each bucket, the other has all entries in the same bucket. Clearly the hashing is not working in the second one.
Hash Functions
3 primary requirements in implementing a good hash function for a given data type:
- It should be deterministic - equal keys must produce the same hash value.
- It should be efficient to compute.
- It should uniformly distribute the keys.
Suppose we have an array that can hold M key-value pairs, then we need a function that can transform any given key into an index into that array.
Positive Integers
modular hashing
Choose the array size M to be prime, and, for any positive integer key k, compute the remainder when dividing k by M. (k % M)
Floating-Point Numbers
Simple but defective way:
If the keys are real numbers between 0 and 1, we might just multiply by M and round off to the nearest integer to get an index between 0 and M-1.
This approach is defective because it gives more weight to the most significant bits of the keys; the least significant bits play no role.
Better way (adopted by Java):
Use modular hashing on the binary representation of the key.
String
Simply treat them as huge integers.
R is prime number, Java uses 31. Calculate each bit of the array.
int hash = 0;
for (int i = 0; i < s.length(); i++)
hash = (R * hash + s.charAt(i)) % M;
Also, we can use MD5 to randomize input keys
int hashFunc(String key) {
return md5(key) % HASH_TABLE_SIZE;
}
APR hash function uses magic number 33. Similar with the first method.
int hashFunc(String key) {
int sum = 0;
for (int i = 0; i < key.length(); i++) {
sum = sum * 33 + (int) key.charAt(i);
sum = sum % HASH_TABLE_SIZE;
}
return sum;
}
Compound Keys
We can follow the ways of processing string.
For example, we use a tuple as key (element1, element2, element3)
int hash = (((element1 * R + element2) % M) * R + element3) % M;
By Using hashCode() in Java
private int hash(Key key) {
return (key.hashCode() & 0x7fffffff) % M;
}
Collision Resolutions
Generally, there are four ways to resolve collision:
- Separate Chaining
- Open Addressing
- Robin Hood Hashing
- 2-Choic Hashing
details check here
Hash Map (Hash Table)的更多相关文章
- [LeetCode] Repeated DNA Sequences hash map
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- POJ 1840 Eqs 二分+map/hash
Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The co ...
- Implement Hash Map Using Primitive Types
A small coding test that I encountered today. Question Using only primitive types, implement a fixed ...
- hdu1381 Crazy Search(hash map)
题目意思: 给出一个字符串和字串的长度,求出该字符串的全部给定长度的字串的个数(不同样). 题目分析: 此题为简单的字符串哈hash map问题,能够直接调用STL里的map类. map<str ...
- (通俗易懂小白入门)字符串Hash+map判重——暴力且优雅
字符串Hash 今天我们要讲解的是用于处理字符串匹配查重的一个算法,当我们处理一些问题如给出10000个字符串输出其中不同的个数,或者给一个长度100000的字符串,找出其中相同的字符串有多少个(这样 ...
- Hash Map 在java中的解释及示例
目录 HashMap在java中的应用及示例 HashMap的内部结构 HashMap的性能 同步HashMap HashMap的构造函数 HashMap的时间复杂度 HashMap的方法 1. vo ...
- TTTTTTTTTTTT 百度之星D map+hash
Problem D Accepts: 2806 Submissions: 8458 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 6 ...
- Redis的增删改查 c# key value类型和hash map 类型
using Newtonsoft.Json; using StackExchange.Redis; using System; using System.Collections.Generic; us ...
- hdu 4622 (hash+“map”)
题目链接:https://vjudge.net/problem/HDU-4622 题意:给定t组字符串每组m条询问--求问每条询问区间内有多少不同的子串. 题解:把每个询问区间的字符串hash一下存图 ...
随机推荐
- INTELLIJ IDEA集成CHECKSTYLE(转)
转自:http://www.cnblogs.com/kiwi-wang/p/4166410.html 本文中使用intelliJ IDEA版本为14.0.1,其他版本差异不大,可同样安装. 下载安装C ...
- StringBuffer学习笔记
StringBuffer是什么? StringBuffer是使用缓冲区的,本身也是操作字符串的,它是一个具体的操作类.与String类不同的是,它其中的内容是可以改变的.它不能像String那样采用直 ...
- 【微信公众号】验证用户OpenID是否关注某个公众号
1.获取OpenID #region 获取微信支付的OpenId /// <summary> /// 获取微信支付的OpenId /// </summary> /// < ...
- poj 2104 K-th Number - 经典划分树
Description You are working for Macrohard company in data structures department. After failing your ...
- [React] React Router: activeStyle & activeClassName
react-router provides two props for setting a specific style on a Link component whose path matches ...
- [Angular 2] Transclusion in Angular 2
Link: Blog Single transclude: <ng-content></ng-content> Multi-translcude: <ng-content ...
- Keil IDE指南.
Keil IDE指南(转载) 熟悉Keil C 51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论在设置上还是在编程思想上,都需要下番功夫研究的 ...
- NumberSpinner( 数字微调) 组件
本节课重点了解 EasyUI 中 Spinner(微调)组件的使用方法,这个组件依赖于Numberbox(数值输入框)和 Spinner(微调)组件. 一. 加载方式//class 加载方式<i ...
- hdu 2031
水题 AC代码: #include<iostream> using namespace std; int main() { int i,j,b[1000],k; while(cin> ...
- NPOI心得
一个Excel文件表示为一个IWookbook,Sheet是ISheet,其它细分为IRow,ICell. 2003和2007版本为IWookbook接口的不同实现:HSSFWookbook和XSSF ...