时间复杂度:基本上是 O(1)
因为可以进行很多优化:例如离线扩容
使用时基本很少有扩容的现象
特征:
相同输入,相同输入
不同输入,均匀分布
哈希冲突的解决方法:
链地址法:数组+链表
开放地址法:当前位置被占,就往下移动一位,如果满,就扩容
二次哈希:进行二次哈希值计算,用的是平方的一种形式
问题:100T的一个文件,每行一个字符串,输出重复的字符串
准备1000台机器,进行编号(0-999).
每行数据计算一个哈希值,再模1000,得到余数,放置到对应的电脑里
那么相同的数据都会放在一台机器里面
问题:
思路:
准备两张hash表,如果一张hash,无法做到等概率返回值
结构:例如 A 先进入,是第 0 个进来的,表1存储为(A,0),表2存储为(0,A)。B进入,是第 1 个进来的,表1存储为(B,1),表2存储为(1,B),此时有个 size 变量,size=2
使用Math.Random(size)返回 表2 的值,做到等概率
删除操作 delete(key),例如现在是 0-999 个数组,要删除第17个,也就是 在 表2 里面 (17,String17)这条数据,现在的做法是,将两张表的最后一条数据(String999,999)拿出来覆盖第17条数据(String17,17),并且 size-- 。