之前的一篇总结已经写到了十万字,阅读起来太不方便了,所以按照类别拆分成多个短篇分享给大家。
文章目录
7. 算法
7.1. 二进制表示
在计算机中,负数以原码的补码形式表达。
原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。
反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
7.2. 红黑树与AVL
7.2.1. 红黑树
红黑树是一种含有红黑结点并能自平衡的二叉查找树。
性质,它必须满足下面性质:
- 每个节点要么是黑色,要么是红色。
- 根节点是黑色。
- 每个叶子节点(NIL)是黑色。
- 从根节点到叶子节点任何一条路径上 不能出现两个连续的红结点
- 从根节点到叶子节点任何一条路径上都包含数量相同的黑结点。
操作:
左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。如图3。
右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。如图4。
变色:结点的颜色由红变黑或由黑变红。
7.2.2. AVL树
AVL的平衡通过平衡因子(bf=左树深度-右树深度)和左单旋、右单旋、左右双旋、右左双旋四种操作保证。
7.2.3. 比较
删除旋转红黑树保证最多三次,而AVL树则可能是对数级别的。但是真实序列里影响不大。
7.3. 大数据下订单去重
- 用一个Hash函数 (f1) 对订单id进行运算, 比如简单的timer33就行。
- 将得到的hash结果数字再对内存区总长度取模。 会得到一个数字 n1.
- 我们把内存区 n1 的位置填为1.
- 然后我们再换几种hash实现, 分别对应的函数式f2, f3, f4, f5. 结果分别是n2, n3, n4, n5.
- 将这些n1, n2, n3, n4, n5位置都填充为1.
这个做法就是Bloom Filter, 也会被翻译为布隆过滤器。BloomFilter是一个概率游戏,判断不在, 则一定不在。 但是判断在, 则可能不在。
当数据存储几个月, 数据量太大导致准去率下降怎么办?~~~~
开30个BloomFilter, 每个订单来时对30个块均染色, 每天过期一个块, 新建一个块。
7.4. 找出一篇文章中,出现次数最多的单词
分治法 + HashMap
每100个文字是一批的处理极限,我们先读出100个,100以内的就直接全部读出。读出后,打散成字符串,例如英语文章它以空格和一些符号分割。使用split方法就可以打散。此时我们得出一个字符串数组String[] array,有了这个之后就可以参考 找出不重复问题的解法。每批使用循环遍历一次,存入 HashMap<String,Integer> 里面,string 对应这个数的字符串,Integer 对应它出现的次数,最后最大的自然就是出现次数最多的。