哈希函数是一个输入域无限但是输出域可以有限的函数
哈希函数/m就可以得到一个在(0,m-1)之间均匀分布的输出域
题目case1:右40亿个无符号整数,给1G的内存,找出出现次数最多的数字
这里使用常规的哈希表存储,会出现内存溢出的问题,表里面的数字都模100,把它存在哈希表中,再遍历这100个表里面的数据,内存就不会出现溢出。
哈希表在使用的时候可以认为其增删改查的复杂度为O(1),实际上为O(lng N)
题目case2:
设计RandomPoo l结构
【题目】
in it-
种结构
在该结构中有如下三个功能:
insert (key):将某个key加入到该结枸,做到不重复加入
delete (key):将原本在结构中的某个key移除
getRandom ():等概率随机返回结构中的任何一个key。
【要求】
Insert、delete和getRandom方法的时间复杂度都是0(1)
解题思路: 准备两个哈希表,一个是index->str,一个是str->index,delete的实现,每次delete一个就用最后一个str去补充这个delete掉的洞;
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class RandomPool
{
private HashMap<K,Integer> keyIndedxMap;
private HashMap<Integer,K> indexKeyMap;
private int size;
public Pool(){
this.keyIndexMap = new HashMap<K,Integer>();
this.indexKeyMap = new HashMap<Integer,K>();
this.size = 0;
}
public void insert(K key){
if(!this.keyIndexMap.containsKey(key)){
this.keyIndexMap.put(key,this.size);
this.indexKeyMap.put(this,size++,key);
}
}
public void delete(K key){
if(this,keyIndexMap.containsKey(key){
int deleteIndex =this.keyIndexMap.get(key);
int lastIndex =--this.size;
K lastKey = this.indexKeyMap.get(lastIndex);
this.keyIndexMap.put(lastKey,deleteIndex);
this.indexKeyMap.put(deleteIndexx,lastKey);
this.keyIndexMap.remove(key);
this.indexKeyMap.remove(lastIndex);
}
}
public K getRandom(){
if(this.size==0){
return null;
}
int randomIndex = (int)(Math.random()*this.size);
return this.indexKeyMap.get(randomIndex);
}
}
布隆过滤器:只会出现白名单变黑的情况不会出现黑名单变白的情况,另外影响白名单误确定为黑名单的因素是哈希表的位图开有多大
n=样本量,p=失误率
步骤:1、确定模型,2、问失误率,失误率与单样本量的大小无关。失误率m=-(N*lnp)/(ln2)^2,
一致性哈希表
按比例抢环可以很好的解决初始不均或者负载不均的情况。