当前位置: 首页 > wzjs >正文

网站开发 自我评价百度网盘搜索引擎

网站开发 自我评价,百度网盘搜索引擎,网站banner怎么更换,在线网站源码提取目录 1、二叉搜索树 1.1、概念 1.2、查找操作 1.2、插入操作 1.3、删除操作 2、Map和Set 2.1、概念及场景 2.2、模型 3、Map 的使用 3.1、Map 的常用方法 4、Set 的使用 4.1、Set的常见方法 1、二叉搜索树 1.1、概念 二叉搜索树又称二叉排序树,它或者是…

目录

1、二叉搜索树

1.1、概念

1.2、查找操作

1.2、插入操作

1.3、删除操作

2、Map和Set

2.1、概念及场景

2.2、模型

3、Map 的使用

3.1、Map 的常用方法

4、Set 的使用

4.1、Set的常见方法


1、二叉搜索树

1.1、概念

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:

  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  • 它的左右子树也分别为二叉搜索树

1.2、查找操作

    public boolean search(int key) {TreeNode cur = root;while (cur != null) {if(cur.val < key) {cur = cur.right;}else if(cur.val > key) {cur = cur.left;}else {return true;}}return false;}

时间复杂度:

最好情况:完全二叉树 O(logN)
最坏情况: 单分支的树 O(N) 

为了避免二叉搜索树是单分支的树导致的效率变低,可以把二叉树调整为平衡二叉树,也叫AVL树(高度平衡的二叉搜索树)

1.2、插入操作

1. 如果树为空树,即根 == null,直接插入

2. 如果树不是空树,按照查找逻辑确定插入位置,插入新结点

    public  boolean insert(int val) {if(root == null) {root = new TreeNode(val);return true;}TreeNode cur = root;TreeNode parent = null;while (cur != null) {if(cur.val < val) {parent = cur;cur = cur.right;}else if(cur.val > val) {parent = cur;cur = cur.left;}else {// key与val相等不插入return false;}}TreeNode node = new TreeNode(val);;if(parent.val > val) {//插入到左边parent.left = node;}else {parent.right = node;}return true;}

1.3、删除操作

设待删除结点为 cur, 待删除结点的双亲结点为 parent

1. cur.left == null

2. cur.right == null

3. cur.left != null && cur.right != null

找到左树中数据最大的结点[左树最右边的数据]或右树中数据最小的结点[右树最左边的数据],用该结点的值替换掉cur的值,再把该结点删除

    public void remove(int key) {TreeNode cur = root;TreeNode parent = null;while (cur != null) {if(cur.val < key) {parent = cur;cur = cur.right;}else if(cur.val > key) {parent = cur;cur = cur.left;}else {//开始删除removeNode(cur,parent);}}}private void removeNode(TreeNode cur, TreeNode parent) {if(cur.left == null) {if(cur == root) {root = cur.right;}else if(cur == parent.left) {parent.left = cur.right;}else {parent.right = cur.right;}}else if(cur.right == null) {if(cur == root) {root = cur.left;}else if(cur == parent.left) {parent.left = cur.left;}else {parent.right = cur.left;}}else {TreeNode targetParent = cur;TreeNode target = cur.right;while (target.left != null) {targetParent = target;target = target.left;}cur.val = target.val;//删除targetif(targetParent.left == target) {targetParent.left = target.right;}else {targetParent.right = target.right;}}}

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能

最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:logN

最差情况下,二叉搜索树退化为单支树,其平均比较次数为:N/2


如果退化成单支树,二叉搜索树的性能就失去了。那能否进行改进,不论按照什么次序插入关键码,都可以使二叉搜索树的性能最佳?

答:TreeMap 和 TreeSet 是 java 中利用搜索树实现的 Map 和 Set,实际上底层用的是红黑树;红黑树是一棵近似平衡的二叉搜索树,所以每次存储元素都得进行大小比较,因此存放到这两个集合类的数据,一定是可比较的

2、Map和Set

2.1、概念及场景

Map和Set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关

例如 Map:

实例化TreeMap,查找的复杂度O(logN)

实例化HashMap,查找的复杂度O(1);

HashMap底层是一个哈希表,而哈希表是由 数组+链表+红黑树 组成的


以前常见的搜索方式有:

1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢

2. 二分查找,时间复杂度为O(logN) ,但搜索前必须要求序列是有序的

上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:
1. 根据姓名查询考试成绩
2. 通讯录,即根据姓名查询联系方式
3. 不重复集合,即需要先搜索关键字是否已经在集合中
可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的Map和Set是一种适合动态查找的集合容器。

2.2、模型

一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,

所以模型会有两种:
1. 纯 key 模型,比如:
有一个英文词典,快速查找一个单词是否在词典中
快速查找某个名字在不在通讯录中
2. Key-Value 模型,比如:
统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数>
Map中存储的就是key-value的键值对,Set中只存储了Key

3、Map 的使用

Map是一个接口,该类没有继承自Collection,该类中存储的是结构的键值对,并且K一定是唯一的,不能重复;键值对之间是通过key进行比较的

3.1、Map 的常用方法

关于Map.Entry说明:

Map.Entry 是Map内部实现的用来存放键值对映射关系的内部类,该内部类中主要提供了<key, value>的获取,value的设置以及Key的比较方式

注意:Map.Entry并没有提供设置Key的方法


Set<Map.Entry<K, V>> entrySet()  :返回所有的 key-value 映射关系

    public static void main2(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("sunny",3);map.put("the",5);map.put("hello",21);Set<Map.Entry<String,Integer>> entrySet = map.entrySet();for(Map.Entry<String,Integer> entry : entrySet) {System.out.println("key: "+entry.getKey() +" value: "+entry.getValue());}}

打印结果:

key: hello value: 21
key: sunny value: 3
key: the value: 5

    public static void main2(String[] args) {TreeMap<String,Integer> map = new TreeMap<>();//查找的复杂度O(logN)map.put("sunny",3);map.put("the",5);map.put("hello",2);//通过key获取val值Integer val = map.get("the"); // 5// Integer val = map.get("the2"); // null// Integer val = map.getOrDefault("the2",9999); // 9999System.out.println(val);System.out.println("===================");// 获取所有的 keySet<String> set = map.keySet();System.out.println(set); // [hello, sunny, the]}

1. Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其 实现类TreeMap或者HashMap
2. Map中存放键值对的Key是唯一的,value是可以重复的

        map.put("hello",2);

        map.put("hello",21);

        打印结果是 hello 21,value值为2的被21覆盖了

3. 在TreeMap中插入键值对时,key不能为空,否则就会抛NullPointerException异常,value可以为空。但
是HashMap的key和value都可以为空。
4. Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
5. Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
6. Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再重新插入。
7. TreeMap和HashMap的区别

4、Set 的使用

Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key

4.1、Set的常见方法

1. Set是继承自Collection的一个接口类
2. Set中只存储了key,并且要求key一定要唯一
3. TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的


4. Set最大的功能就是对集合中的元素进行去重
5. 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础
上维护了一个双向链表来记录元素的插入次序。
6. Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
7. TreeSet中不能插入null的key,HashSet可以。
8. TreeSet和HashSet的区别

5、HashMap 和 HashSet总结

1. HashMap 和 HashSet 即 java 中利用哈希表实现的 Map 和 Set
2. java 中使用的是哈希桶方式解决冲突的
3. java 会在冲突链表长度大于一定阈值后,将链表转变为搜索树(红黑树)
4. java 中计算哈希值实际上是调用的类的 hashCode 方法,进行 key 的相等性比较是调用 key 的 equals 方法。所以如果要用自定义类作为 HashMap 的 key 或者 HashSet 的值,必须覆写 hashCode 和 equals 方法,而且要做到 equals 相等的对象,hashCode 一定是一致的。

http://www.dtcms.com/wzjs/260255.html

相关文章:

  • 中国化学工程第九建设公司网站广东省人大常委会
  • 大连软件公司排行东莞网络排名优化
  • 包车哪个网站做的最好网络营销推广方式案例
  • 青岛网站建设康之迅好看的seo网站
  • 昆山做网站公司百度网址大全怎么设为主页
  • 利用wps做网站引流推广神器
  • 天津疫情最新数据北京网站优化外包
  • 如何建立一个网站主页怎么自己创建网站
  • 南阳百度网站推广外链查询
  • 做动态网站需要学什么网络营销策划ppt
  • wordpress如何添加文章来源免费seo快速收录工具
  • cms做网站可以做些什么网站十大骗子教育培训机构
  • wordpress首页显示标签百度seo怎么操作
  • 南充网站建设价格google play store
  • 17网站一起做网店代发流程百度大搜推广
  • 如何做网站标头新媒体平台
  • 开个做网站的公司 知乎营销公司
  • 网站建设推广哪家好长春网站优化团队
  • 南京 推广 网站建设google官网下载
  • 商城网站建设方案 2017如何用手机创建网站
  • wordpress很慢北京seo专员
  • 网站开发与设计公司深圳做网站的
  • 电影网站怎么做要多少钱网站加速器
  • 网站建设的知名公司百度手机管家
  • 深圳网站建设专家百度seo快速排名
  • 大数据适合什么人学绍兴seo网站管理
  • 成都大型网站设计公司全球网站流量排名100
  • wordpress添加直达链接长沙seo顾问
  • 商机网网站源码线上拓客渠道有哪些
  • 自己做网站做那种类型微博热搜榜排名今日