哈希表
1.相关概念
Hash一般翻译为“散列”,直接音译为“哈希”。
简单的将就是一种将任意长度 的消息压缩到某一固定长度的消息摘 要的函数。
有散列函 数都有如下一个基本特性:根据同一散列函 数计算 出的散列 值如果不同,那么输入值肯定也不同。但是,根据同一散列函 数计算 出的散列 值如果相同 ,输入值不一定相同。
在Ja va中任意一个对象都有一个hashCode()方法,可以获取任意一个对象的hash值。
publicnative int hashCode();
2.哈希冲突
当两个不同的输入值,根据同一散列函 数计算 出相同 的散列 值的现象,就把它叫做碰撞(哈希碰撞)。
3.散列算法
散列 法Hashing是一种将字符组成 的字符串转换为固定长度( 一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法。
由于通过更短 的哈希 值比用原始 值进行数据库搜索更快,这种方法一般用来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。
String类型的定义
public final class Stirng
implements java.io.Serializable,Comparable<String>,CharSequence{}
具体的字符串值是采用char[]进行存储 ,而且一旦创 建则不能修改。真正的修改操作都会引发对象的新建.
String类型中的hashCode方法的实现:
public int hashCode(){
int h = hash ;
if(h == 0 && value.length>0){
char val[] = value;
for(int i=0;i<value.length;i++){
h = 31* H + val[i];
}
hash = h;
}
return h;
}
二叉树
二叉 搜索树(Binary Search Tree,简称 BST),BST是一种很常用的的二叉 树。它的定义是:一个二叉 树中,任意节点的值要大于等于左子树所有节点的值,且要小于等于右边子树的所有节点的值。
主要针对链 表的插入和删除 很快 ,但是是查找数据却很慢 的特点 。树状结构最大的优势 在于查找,但是插入和删除的效率都不太高。
public class Node{
private Object data; //结点数据
private Node left //左子节点的引用
private Node right //右子节点的引用
1.二叉树的特点:
左子树上所有结点的值均小于或等于它的根结点的值
右子树上所有结点的值均大于或等于它的根结点的值
左、右子树也分别为二叉排序树。
2.二叉树的遍历
中序遍历:左子树——》 根节点——》右子树
前序遍历:根节点——》左子树——》右子树
后序遍历:左子树——》右子树——》 根节点
二叉树在极端情况下会退化为链表结构,为了避免出现这个问题,引入平衡树AVL 树是一种平衡二叉树,平衡二叉树递归定义如下:
左右子树的高度差小于等于1。
其每一个子树均为平衡二叉树。
AVL树引入了所谓监督 机制,就是在树的某一部分的不平衡 度超 过一个阈值后触发 相应 的平衡操作。保证树的平衡度在可以接受的范围内。
public class TreeNode{
int val;
int height; //多加了一个高度,用来记录每个节点的高度
TreeNode left;
TreeNode right;
TreeNode(int x){
val = x;
}}
3.红黑树
红黑树 是一种近似平衡 的二叉 查找树 ,查找、删除 、插入都快,树经常 需要进行旋转达到平衡,但是平衡算法很复杂。
红黑树特征:
(1)每个节点不是红色就是黑色的;
(2)根节点总是黑色的;
(3)如果节点是红色的,则它的子节点必须是黑色的(反之不一定),(也就是从每个叶子到根的所有路径上不能有两个连续的红色节点);
(4)从根节点到 叶节 点或空子节点的每条路径,必须包含相同数目的黑色节 点( 即相同 的黑色高度).