散列表 哈希算法 树形结构
散列表:概念 函数 应用
散列表Hash Table:哈希表 根据键key 数组演变来的
key 散列函数 table
散列函数:hashValue = hash(key) 将给定的key转换为特定的散列值
要求:1.计算得到的散列值必须大于等于0的正整数,作为数组下标;2. if key1==key2, hash(key1)==hash(key2); 3. if key1!=key2, hash(key1)!=hash(key2)
好的散列表满足:1.散列函数不能太复杂;2. 散列函数计算出的哈希值尽可能随机且均匀分布,将散列冲突最小化。
设计方法:1. 直接寻址法 hash(key)=key; 2. 除留余数法;3 平方取中法
哈希碰撞(哈希冲突)、散列冲突:不同key,相同哈希值 key1!=key2, hash(key1)==hash(key2)
解决思路:
开放寻址法:一旦出现冲突,就去寻空的散列地址
1.线性检测 步长为1 hash(key)+n;2.二次检测 哈希值+下一个的平方 hash(key)+n^2;3.双重散列
链表法:数组的下标位置称为桶或槽,桶开辟一个链表结构 hash map底层用的链表法 适用大数据
散列表应用:hash map 散列表结构 jdk1.8比1.7引入了红黑树 链表长度>8 转成红黑树
hash算法(摘要算法)
特点:1.唯一对应;2.长度固定,不相同;3.不能反向破译;4.执行效率要高
哈希算法MD5 SHA家族 安全散列算法 哈希算法的范畴
树:非线性数据结构
线性数据结构:数组 链表 栈 队列
结点:根结点 一个根结点;叶子结点;父结点;子结点;兄弟结点
树的高度、深度、层
高度:节点到叶子节点的最长路径,叶子结点的高度为0
深度:根结点到这个结点经历的个数,根深度为0
树的高度:根结点的高度
二叉树:每个节点最多有2个子树
子树;左子树;右子树
分类:满二叉树:每个节点有左右两个子结点;完全二叉树:叶子出现在最底下2层,其它层最大,最后一层叶子结点靠左排列
数组或链表存储 完全二叉树节省空间
二叉树存储结构:顺序存储(连续空间存储),链式存储(存储离散的,不连续的)
链式存储:
结点: left data right
叶子:null data null
顺序存储:数组
存储公式:父结点存储在i位置,左子结点存储在2*i位置,右子结点存储在2*i+1位置
二叉查找树:二叉搜索树
特点:
1.右子树不空,右子树所有结点值均大于它的根结点的值;
2.左子树不空,左子树所有结点值均小于它的根结点的值;
3.任意结点的左、右子树也分别为二叉查找树;
4.没有键值相等的结点。
查找操作:插入操作 查找操作 删除操作:1本身是叶子结点;2.只有一个叶子结点;3.有2个结点
BSTree
时间复杂度:最坏o(n) 一般 o(logn) 取决于树的高度o(height)
平衡二叉查找树(AVL树)
性质:可以是空树;左子树的所有结点的值都比根结点的值小,右子树所有结点值比根结点值大;任一结点的左子树和右子树都是平衡二叉树,高度差绝对值不超过1
二叉树退化成链表。 失衡:结点的平衡因子大于1
LL RR LR(先RR,再LL) RL(先LL,再RR) 旋转
中序遍历
平衡二叉树插入操作:insert