- 基本知识点
- 数组
- 栈
- 链表
(1)单链表
(2)双向链表
(3)循环链表 - 队列
- 图
- 哈希表
(1)hashmap
(2)hashset
(3)哈希函数
(4)一致性哈希 - 树
(1)二叉树的遍历
(2)二叉搜索树
(3)完全二叉树
(4)满二叉树
(5)平衡二叉树 - 堆
(1)大根堆
(2)小根堆
1.基本知识点
(1)存储结构
顺序存储结构
概念:
用一组在内存上连续的 存储单元依次存储数据元素
数据元素之间的逻辑关系由元素的存储位置来表示
优点:
(1)无需为表示结点的逻辑关系增加额外空间
(2)可以方便的存取表中的任意元素
缺点:
(1)插入、删除某个结点必须移动大量结点
(2)要预先进行静态分配物理空间
链接存储结构
概念:
用一组在内存上任意的存储单元存储数据元素
数据元素之间的逻辑关系由指针来表示
优点:
(1)插入、删除某个结点非常方便
(2)无需预先静态分配物理空间
缺点:
(1)不能随机存取元素
(2)额外空间复杂度高
(2)逻辑结构
有四种基本形态:
(1)元素间没有任何关系 -> 集合
(2)元素间有线性关系 -> 线性结构
(3)元素间有层次关系 -> 树结构
(4)元素间有网状关系 -> 图结构
(3)线性 与 非线性
线性:
元素之间由 顺序存储结构或链接存储结构 像一根线一样串联起来
非线性:
元素之间的关系不能像线一样串联起来
7.哈希表
(3)哈希函数
性质:
(1)输入域:无穷大
(2)输出域:有限。hashcode为16进制,16位,每一位可以从0-9,a-f
中选一个(16^16 = 2^64)
(3)同样的输入一定有同样的输出
(4)不同的输入可能也会有同样的输出(因为输入域无穷大,输出域有限)
(5)输入域数据量多了之后,在输出域中均匀分布,呈离散性
哈希表增删改查时间复杂度为O(1)
经典哈希:数组后面挂链表结构
扩展哈希:数组后面挂红黑树结构
应用:
背景:有一个很大的文件,100T,其中存着字符串文本,目的要找出重复文本
达到去重效果
解决办法:用哈希来分流。分配1000台机器,给机器标号0~999,把这个大文件
通过哈希来分流到这1000个机器上,相同的文本一定会被分到同一个机器上
具体实现:把文本每行读出来,利用哈希函数算出hashcode,再把hashcode
取模1000,模出来的值就是要放的机器。
(4)一致性哈希
问题:当哈希表负载,要扩容时,如何较好的迁移
一致性哈希的任务:把迁移的代价变得很低,同时又负载均衡
办法:把整个哈希函数的返回值想象成一个环,把三台机器放到环中
对key进行hashcode后,把key和value放到环中,顺时针找离放的位置最近的机器
普通具体实现:
客户端:3台机器
前端:无差别的负载的服务器
把m1、m2、m3三个机器的ip值进行hashcode排序成一个数组,放到服务器中
一个request文本进来后,用二分的方式在数组中找到第一个大于等于文本hashcode
的位置,即为要去的机器
普通实现面临的问题:
(1)当机器数量少时,哈希函数离散性不能体现,初始负载不均匀
(2)当加减机器时,负载也会变得不均匀
解决办法:
(1)给每个真实的机器分配一定数量的虚拟节点,通过路由表一一对应
(2)将虚拟节点打到环上,虚拟节点对应的区域由真实机器处理
(3)加减机器时,再打进、减去等量的虚拟节点,通过虚拟节点的比例来负载均衡