目录
Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。
常见的搜索方式有:
1.直接遍历:时间复杂度为O(N),元素较多的时候效率会很慢2.二分查找:时间复杂度为O(logN),但是搜索前要求数据是有序的
常见的几种搜索比较适合静态类型的查找,一般不会对数据进行增删查改,而对现实中的查找,多数是变动的. 比如:对手机通讯录的增加联系人,删除联系人,更改联系人的联系方式.对于这中查找,上述的搜索方式明显不太适用了.
而我们的Map和Set是一种适合动态查找的集合容器,有着明显的优势.
一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以 模型会有两种:
1.Key模型:
比如:
- 查找一个英文单词
- 查找微信列表中某一个备注是否存在
2.Key-Value模型 :
- 查找一个数据出现的次数
- 一个分数表中某一个分数的人数有几个
对应到我们本文章要讲的Map和Set
Map存储的是Ket-Value的键值对,Set存储的是单纯的Key
我们可以这样理解,Set中不会出现重复的数据,当要插入是会查询这个数据是否存在,如果存在,就不会进行插入,Map的话,如果存在我们就可以直接修改Value的值
TreeMap 和 TreeSet 即 java 中利用搜索树实现的 Map 和 Set;实际上用的是红黑树,而红黑树是一棵近似平衡的 二叉搜索树,即在二叉搜索树的基础之上 + 颜色以及红黑树性质验证
所以接下来我们来了解一下搜索树
一.搜索树
二叉搜索树又称为二叉排序树,或者是一颗空树,或者是具有以下性质的树:
- 若它的左子树不为空,则它左子树上所有的节点的值都小于根节点的值
- 若它的右子树不为空,则它左子树上所有的节点的值都大于根节点的值
- 它的左右子树也是一颗二叉搜索树
对于一颗搜索树它有几个关键操作:
1.查找
以上面的图为例子,我们要查找" 7 "这个值即 Key = 7
- 如果根节点不为空
- 根节点的值 == Key return;
- 如果根节点的值 < key 向右子树查找
- 如果根节点的值 > key 向左树查找
- 到新的根节点重复上述操作
- 如果未找到即这个节点不存在
为了后续代码方便展示我们来搭好款框架:
- 我们需要一个 val值
- 一个left节点
- 一个right节点
- 还有一个头结点
- 需要一个构造方法
public class BinarySearchTree {
static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
}
public TreeNode root = null;
我们用java代码来实现这个简单的搜索操作:
public boolean search(int val) {
TreeNode cur = root;
if (root == null) {
return false;
}
while (cur != null) {
if (cur.val == val) {
return true;
} else if (cur.val > val) {
cur = cur.left;
} else {
cur = cur.right;
}
}
//循环结束还没有返回true 即返回false;
return false;
}
数据是实现insert插入的数据:
我们查找 7 这个val:
public static void main(String[] args) {
BinarySearchTree bTree