Java基于二分搜索树、链表的实现的集合Set复杂度分析实例详解

 更新时间:2020年03月29日 13:03:41   作者:WFaceBoss  
这篇文章主要介绍了Java基于二分搜索树、链表的实现的集合Set复杂度分析,结合实例形式详细分析了Java基于二分搜索树、链表的实现的集合Set复杂度分析相关操作技巧与注意事项,需要的朋友可以参考下

本文实例讲述了Java基于二分搜索树、链表的实现的集合Set复杂度分析。分享给大家供大家参考,具体如下:

两种集合类的复杂度分析

Java底层基于二叉搜索树实现集合和映射 和Java底层基于链表实现集合和映射中以二分搜索树和链表作为底层实现了集合Set,在本节就两种集合类的复杂度分析进行分析:
测试内容:Java底层基于二叉搜索树实现集合和映射Java底层基于链表实现集合和映射中使用的书籍。
测试方法:测试两种集合类查找单词所用的时间

 //创建一个测试方法 Set<String> set:他们可以是实现了该接口的LinkedListSet和BSTSet对象
 private static double testSet(Set<String> set, String filename) {
  //计算开始时间
  long startTime = System.nanoTime();
  System.out.println("Pride and Prejudice");
  //新建一个ArrayList存放单词
  ArrayList<String> words1 = new ArrayList<>();
  //通过这个方法将书中所以单词存入word1中
  FileOperation.readFile(filename, words1);
  System.out.println("Total words : " + words1.size());

  //增强for循环,定一个字符串word去遍历words
  //底层的话会把ArrayList words1中的值一个一个的赋值给word
  for (String word : words1)
   set.add(word);//不添加重复元素
  System.out.println("Total different words : " + set.getSize());

  //计算结束时间
  long endTime = System.nanoTime();
  return (endTime - startTime) / 1000000000.0;//纳秒为单位
 }

 public static void main(String[] args) {
  //基于二分搜索的集合
  BSTSet<String> bstSet = new BSTSet<>();
  double time1 = testSet(bstSet, "pride-and-prejudice.txt");
  System.out.println("BSTSet:" + time1 + "s");
  System.out.println("————————————————————");
  //基于链表实现的集合
  LinkedListSet<String> linkedListSet = new LinkedListSet<>();
  double time2 = testSet(linkedListSet, "pride-and-prejudice.txt");
  System.out.println("linkedListSet:" + time2 + "s");

 }

结果:BSTSet的速度比LinkedListed的速度快

集合的时间复杂度分析:

1.链表情况

2.二叉搜索树的情况

在基于二叉搜索树的情况下,增加、查询、删除的与二叉搜索树的深度有关,每次操作均为从根节点到某一一支子树的叶子节点之间进行操作,时间复杂度为0(h),h表示二叉搜索树的高度(层数)。

二叉搜索树复杂度如下:

2.1 探究链表情况下的n与二叉搜索树的h的关系

下面对n与h关系进行推导:

2.1.1 采用满二叉树的情况进行分析(最优情况)

采用满二叉树(每个节点都有左右节点,除了叶子节点)来进行分析的原因为满二叉树是一种极端情况,如下图:

 

 从上图中关于h层总共有多少个节点有如下推导:

假设节点个数为n个则有如下关系:

针对都是log级别的关系,底数是多少不影响它是log级别的则有:

2.1.2 单个孩子情况----二叉搜索树最坏情况(节点数等于其高度)

比如:下面这种二叉搜索树

对于这种只有单个孩子的情况,此时二叉搜索树退化成了链表,此时的时间复杂度为O(n)。

2.2 两种集合复杂度统计

2.2.1 logn和n的差距

推荐是最好的支持,关注是最大的鼓励。亲爱的朋友,很荣幸在园子里遇到您。

本节涉及的源码地址为https://github.com/FelixBin/dataStructure/tree/master/src/SetPart

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Java dom4j生成与解析XML案例详解

    Java dom4j生成与解析XML案例详解

    这篇文章主要介绍了Java dom4j生成与解析XML案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java 实战项目之毕业设计管理系统的实现流程

    Java 实战项目之毕业设计管理系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现毕业设计管理系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • idea安装jerbel及文件上传下载的实现示例

    idea安装jerbel及文件上传下载的实现示例

    JRebel是一个Java开发工具,它是一款用于实时代码重载的插件,本文主要介绍了idea安装jerbel及文件上传下载的实现示例,具有一定的参考价值,感兴趣的可以了解下
    2023-09-09
  • 利用Java实现mTLS调用

    利用Java实现mTLS调用

    这篇文章主要介绍使用 Java作为客户端 与受 mTLS 保护的服务交互。为了对我们的 Java 客户端进行 ssl 配置,我们需要先设置一个 SSLContext。这简化了事情,因为 SSLContext 可用于各种 http 客户端,接下来我们一起进入下面文章了解具体内容,需要的朋友可以参考一下
    2021-11-11
  • Tomcat报错:HTTP Status 500 (Wrapper cannot find servlet class)解决办法

    Tomcat报错:HTTP Status 500 (Wrapper cannot find servlet class)

    这篇文章主要介绍了Tomcat报错:HTTP Status 500 (Wrapper cannot find servlet class)解决办法的相关资料,需要的朋友可以参考下
    2016-11-11
  • 使用Mybatis遇到的坑之Integer类型参数的解读

    使用Mybatis遇到的坑之Integer类型参数的解读

    这篇文章主要介绍了使用Mybatis遇到的坑之Integer类型参数的解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • MyBatis 与 Spring 的完美整合方法

    MyBatis 与 Spring 的完美整合方法

    MyBatis 和 Spring 两大框架已经成了 Java 互联网技术主流框架组合,它们经受住了大数据量和大批量请求的考验,在互联网系统中得到了广泛的应用。这篇文章主要介绍了MyBatis 与 Spring 整合,需要的朋友可以参考下
    2018-04-04
  • Java 常见的并发问题处理方法总结

    Java 常见的并发问题处理方法总结

    这篇文章主要介绍了Java 常见的并发问题处理方法总结,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • Java基础之堆内存溢出的解决

    Java基础之堆内存溢出的解决

    这篇文章主要介绍了Java基础之堆内存溢出的解决,文中有非常详细的图文示例及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Java动态数组添加数据的方法与应用示例

    Java动态数组添加数据的方法与应用示例

    这篇文章主要介绍了Java动态数组添加数据的方法,结合实例形式详细分析了Java动态数组的创建、添加、查找、打印等相关操作技巧,需要的朋友可以参考下
    2019-11-11

最新评论