### July博客第十二章参考学习
## 第一题:给40亿个不重复的unsigned int 的整数,无序,给一个随机数,快速判断这个是否在40亿个数当中
1. 个人思路:
- bitmap,重点在于不重复
- hash , 无法使用hash
2. July 答案:
- bitmap, 使用 unsigned int 作为表示 32个数是否存在,需要 40亿/32 个这样的unsigned int 换算下来在C++中需要512M
3. 拓展:当数据超出可接受范围之后
- 基本概念:LZW(Lenpel-Ziv &Welch) , 对原始数据:ABCCAABCDDAACCDB进行LZE压缩,0-A,2-B,3-C,3-D,4-AB,5- CC,可以实现压缩 45A4CDDAA5DB。
- 适用范围:原始数据串最好是大量的子串多次重复出现,重复的越多,压缩效果越好。反之越差。
- 揭示原理:算法本身,是为了解决时间和空间均衡问题,要么时间换空间,要么空间换时间。
## 第二题:遍历n个元素取出等概率随机取出其中之一元素
1. 个人思路:
- 遍历每个元素的时候用当前的系统时间作种子,生成随机数,最后遍历一次随机数最大或者最少的作为选择条件。
- 面对问题:如果两个随机数相同怎么办?虽然概率很少但是还是可能出现。
2. BigPotato答案:
## 第三题:提取出某日访问百度次数最多的那个IP,IP总数量不超过 40 亿次。
1. 个人思路:
- 无
2. luuillu答案:
- 考虑IP 32位,不超过40亿次的IP 最少占内存16G,将IP地址的前5位作为区间编号,剩下的27作为区间内的值,建立32个临时文件,把相同区间IP地址保存到同一的临时文件中。统计IP出现次数,找到访问次数最大的IP地址。
## 第四部分:回文判断
# 第一问:判断一个字符是否回文
1. 个人思路:
- 无
2. July答案一(使用数组):
- 字符串逆旋,存入另一个字符串,和原来的字符串对比
- 两头扫描,直到遇到两端字符都是同一个字符,结束。
- 从中间开始,向两头扫描。
3. July答案二(使用栈):
- 依次入栈,依次出栈,得到逆置串,和原字符串比较。
4. July答案三(使用单链表):
- 最大难点:单链表单向,快慢指针定位到中间,后半部分逆置(如何实现单链表逆置?又是一个疑问),两指针从中间和开头开始遍历。
# 第二部分,回文的应用:查找一个字符串中的最长回文字串
1. 个人思路:
- 无
2. July答案一:
- 枚举所有的子串,分别判断其是否为回文
-
3. 无心情继续看,回文的最后部分未能完成。今日学习毕。