哈希函数
特征
- 输入域是无穷的 输出域是有范围的
- 常见的 比如MD5函数 和SHA1函数 输出范围见下图 (MD5是长度为16位的十六进制字符串,后者是32位的,一个十六进制位等于4个二进制位)

- 相同的输入有相同的输出
- 因为输入域是无穷的 输出域相对有限 会发生哈希碰撞
- 具有离散型 和 均匀性 假设输入的字符串有规律 比如”abc1” “abc2” “abc3” 输出的结果也会在输出域上离散开来 均匀性指 在输出域中 任取几段小范围 小范围上的值的个数差不多一样 如下图

- 人为对输出域中的值 %m 那么输出在0~m-1上均匀分布 见下图
练习题
40亿个数据,每个数的范围是0-42亿,给你1g内存 让你统计出现最多次数的那个数
- 用常规解法内存不够用 最大需要32GB
- 用hash函数 帮所有数分配到100个小文件里 相同的数一定在同文件 不同的数也会均匀分布在100个文件 再对100个小文件用常规HashMap解法 每个文件得到一个出现最多的数 最后在统计这100个数 只需要0.32G内存
哈希表的实现
-
扩容代价
假设往hashmap里加入1000个字符串 链表长度超过2就要扩容 那么总共扩容logn次 每次扩容需要重新移动n个节点 总共扩容代价是O(nlogn)的 均摊一下,单个插入的扩容代价就是 logn
优化技术
增加链表长度
增加链表长度 减少扩容次数 logn就会变得特别小 贴近O(1)
jvm后台离线扩容
设计RandomPool结构
岛问题
普通解法
思路:首先遍历这个矩阵里的所有元素,如果碰到为1的元素 就递归的对这个元素进行感染 infect 操作
- 感染操作就是将附近的一片1都改成2 这样递归的结束条件就得出了
- infect函数递归的将上下左右都进行infect操作 如果越界或者不为1就返回
- 时间复杂度为 log n * m n代表遍历次数 m代表每个节点最多被访问四次
并行解法
第二章 1小时8分
