JavaDS —— 初识集合框架 + 时间/空间复杂度

目录

1. 初识集合框架

1.1 集合框架的初识

1.2 什么是数据结构?

2. 时间与空间复杂度

2.1 时间复杂度

2.2 大O的渐进表示法

2.3 常见时间复杂度计算举例

2.4 空间复杂度


1. 初识集合框架

1.1 集合框架的初识

什么叫集合?什么叫框架?什么又叫集合框架?这几个字该怎么理解?下来我们一起来看。

首先,在java中集合框架也被叫做容器(container),是在java.util包底下的一组接口和其实现类.

注意: 列举了常用的接口或者抽象类, 展示了集合之间的关系,这个每个集合类放在一起就叫做集合框架;这些集合类是Java官方已经写好的类,我们需要学习的就是这一个个类或者接口背后的结构是一个什么样的东西。所以我们要学习集合,就需要学习它们背后的数据结构。


1.2 什么是数据结构?

什么是数据结构?通俗来说就是数据+结构。

举个例子:我们平时日常生活中的数据:做核酸,停车场的车位号等等,那么我们就用数据结构组织这样一堆堆的数据.

数据结构有许多:单链表、二叉树、数组等等

数据结构多种多样的原因,就是面对不同的数据我们描述和组织数据的方式不同。

所以当我们把数据结构学明白了,就可以了解了整个常用集合框架背后的知识。

于是我们接下来就会学习到:顺序表、链表、二叉树、栈、队列、堆、哈希表、AVL树、红黑树、B树……

2. 时间与空间复杂度

如何衡量一个算法的好坏?

由于我们看代码好坏的角度不一样,也就是衡量标准不一样,我们得出的结果就不一样,还有,可能由于其他的一些原因也会导致每个人的结果是不一样的,比如说硬件(内存等等)、计算标准(时间长短)等等。

那么我们在这里就统一使用如下标准:使用时间和空间两个角度去衡量算法的好坏。

那么衡量一个算法好坏是时间重要还是空间重要呢?

实际上两者都是重要的,但是平时我们通常追求的是时间的快慢,其次才是空间,因为空间随着时代的发展内存的空间可使用空间越来越大,所以我们会尽可能的浪费一点空间来取换取我们的时间.

算法效率
算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

2.1 时间复杂度

定义:在计算机科学中,算法的时间复杂度是一个数学函数,用于描述算法执行所耗费的时间的快慢。

理论上我们是无法计算出一个算法所运行的时间的,因为这和硬件等各种因素是有关系的,硬件不同,执行的时间也不同。

所以我们这样分析:一个算法的时间复杂度和算法当中语句所执行的次数是成正比的,也就是说,语句越多,执行的次数就越多,所浪费的时间也是成正比的。

那么我们既然不能定量的去计算出实际上执行次数的时间,但是我们可以通过函数去描述它的时间,那这个函数就跟语句执行次数有关系,所以当我们看到代码之后我们可以看一下这个代码基本语句的执行次数有多少次。

算法中的基本操作的执行次数,为算法的时间复杂度。

有了这个概念之后我们通过以下几个例子来介绍一下:

    // 请计算一下func1基本操作执行了多少次?void func1(int N) {int count = 0;for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {count++;}}for (int k = 0; k < 2 * N; k++) {count++;}int M = 10;while ((M--) > 0) {count++;}System.out.println(count);}

可以看出, count++执行的次数是最多的;

先看第一个嵌套的 for 循环,都是0~N,那么 count++执行了多少次?
这里有n个 i ,每个 i 都走 n 次,那么所有的 i 就一共走了n^2次,即在这个 for 循环里面就是执行了 n^2 次;
第二个for:2n次;
第三个for:10次;
最终相对比较准确的是n^2 + 2n + 10.

但是我们发现,n^2 + 2n + 10只是我们语句的一个执行次数,在程序员角度,并不是以这样一个多项的表达式作为一个复杂度的,当我们的n越来越大的时候,最终算出来的值可以忽略掉这个10,那么也就是说,当n非常非常大的时候,有些东西是可以忽略掉的,于是就有了我们这样一些规则,我们把它叫做大O的渐进表示法.

2.2 大O的渐进表示法

实际中我们计算时间复杂度时,我们其实并不需要计算精确的执行次数,而只需要大概执行次数,即使用 大O的渐进表示法计算复杂度.

大O的渐进表示法
1. 用 常数1取代运行时间中的所有加法常数;
2. 在修改后的运行次数函数中,只 保留最高阶项
3. 如果最高阶项存在且不是1,则 去除与这个项目相乘的 常数。得到的结果就是大O阶。

注意: 在这里我们在计算大O阶的时候并不是看着代码求,而是需要结合数学思想求解。


补充概念:

最坏情况复杂度;最好情况复杂度;平均复杂度。
我们直接举例说明:在数组中找一个数字的时间复杂度最坏是O(n),最好是O(1),平均是n/2。

我们所接触到的最多的情况就是最坏情况时间复杂度。


2.3 常见时间复杂度计算举例

    // 计算func2的时间复杂度?void func2(int N) {int count = 0;for (int k = 0; k < 2 * N; k++) {count++;}    // 2nint M = 10;while ((M--) > 0) {count++;}    // 10System.out.println(count);}

func2的时间复杂度为:O(n);


    // 计算func3的时间复杂度?void func3(int N, int M) {int count = 0;for (int k = 0; k < M; k++) {count++;}    // Mfor (int k = 0; k < N; k++) {count++;}    // NSystem.out.println(count);}

func3的时间复杂度为:O(M+N);


   // 计算func4的时间复杂度?void func4(int N) {int count = 0;for (int k = 0; k < 100; k++) {count++;}    // 100System.out.println(count);}

func4的时间复杂度为:O(1);

注:100是常数,常数看作1(第一条规则)


    // 计算bubbleSort的时间复杂度?    最坏是时间复杂度?最好复杂度?void bubbleSort(int[] array) {for (int end = array.length; end > 0; end--) {    //【0,n】boolean sorted = true;for (int i = 1; i < end; i++) {    //n-1 n-2 …… 1(n在变导致i也在变)if (array[i - 1] > array[i]) {swap(array, i - 1, i);sorted = false;}}if (sorted == true) {break;}}}

注:算一下 end 的取值: [ n, n-1, n-2, ...... , n-(n-1) ]

i 的取值-> [ n-1, n-2, n-3, ... , 1, 0 ]

所以对 i 进行求和(等差数列求和),结果为:(最坏情况下if (array[i - 1] > array[i])每次都被执行)n*(n-1) / 2, 所以最坏情况下时间复杂度为O(n^2),最好情况下就是数组有序了,复杂度为O(n)。


    // 计算binarySearch的时间复杂度?int binarySearch(int[] array, int value) {int begin = 0;int end = array.length - 1;while (begin <= end) {int mid = begin + ((end - begin) / 2);if (array[mid] < value)begin = mid + 1;else if (array[mid] > value)end = mid - 1;else return mid;}return -1;}

注:二分查找,每次“砍”一半:N -> N/2 -> N/4...;

于是:N/2^x = 1 => x = logN(以2为底N的对数)


    // 计算阶乘递归factorial的时间复杂度?long factorial(int N) {return N < 2 ? N : factorial(N - 1) * N;}

注:递归的时间复杂度 = 递归的次数 * 每次递归执行的次数

本题中,每次递归相当于是一个三目运算符在走,所以每次递归执行的次数是常数次1,所以对于本题来说只需要找到递归的次数就是它的时间复杂度。本题递归的次数是n-1次。

factorial的时间复杂度为:O(n);


    // 计算斐波那契递归fibonacci的时间复杂度?int fibonacci(int N) {return N < 2 ? N : fibonacci(N - 1) + fibonacci(N - 2);}

注:每一次递归,都会有两次“子递归”,所以递归次数就为:

2^0 + 2^1 + 2^2 + ... + 2^(n-1) = 2^n - 1次

斐波那契递归fibonacci的时间复杂度为O(2^n)

总结:
复杂度的计算需要通过结合代码的思想来做的。不能光靠代码来给出复杂度。

2.4 空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。

    // 计算bubbleSort的空间复杂度?完成这个算法临时空间的大小void bubbleSort(int[] array) {for (int end = array.length; end > 0; end--) {boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {swap(array, i - 1, i);sorted = false;}}if (sorted == true) {break;}}}

bubbleSort的空间复杂度为O(1),因为没有让临时空间出现增加的情况。

如果修改以上代码:

    // 计算bubbleSort的空间复杂度?完成这个算法临时空间的大小void bubbleSort(int[] array) {for (int end = array.length; end > 0; end--) {int tmp = new int[array.length];//->拷贝array这个数组里面的数组boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {Swap(array, i - 1, i);sorted = false;}}if (sorted == true) {break;}}}

复杂度就变为O(n);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/158551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webGL开发微信小游戏

WebGL 是一种用于在浏览器中渲染 2D 和 3D 图形的 JavaScript API。微信小游戏本质上是在微信环境中运行的基于 Web 技术的应用&#xff0c;因此你可以使用 WebGL 来开发小游戏。以下是基于 WebGL 开发微信小游戏的一般步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有…

redis之数据类型

&#xff08;一&#xff09;关系型数据库和非关系型数据库的区别 1、关系型数据库是一个机构化的数据库&#xff0c;列和行 &#xff08;1&#xff09;列&#xff1a;声明对象 &#xff08;2&#xff09;行&#xff1a;记录对象的属性 &#xff08;3&#xff09;表与表之间…

深度学习环境配置(Anaconda+pytorch+pycharm+cuda)

NVIDIA驱动安装 首先查看电脑的显卡版本&#xff0c;步骤为&#xff1a;此电脑右击-->管理-->设备管理器-->显示适配器。就可以看到电脑显卡的版本了。 然后按照电脑信息&#xff0c;到地址 去安装相应的驱动&#xff0c;Notebooks是笔记本的意思&#xff0c;然后下…

数据结构与算法【堆】的Java实现

前言 之前已经说过堆的特点了&#xff0c;具体文章在数据结构与算法【队列】的Java实现-CSDN博客。因此直接实现堆的其他功能。 建堆 所谓建堆&#xff0c;就是将一个初始的堆变为大顶堆或是小顶堆。这里以大顶堆为例。展示如何建堆。 找到最后一个非叶子节点从后向前&…

ChatGPT 使用入门

背景 ChatGPT是一个强大的聊天机器人助手&#xff0c;内置了大量的互联网知识文档&#xff0c;且具有上下文记忆&#xff0c;可以帮我们快速地查找一些资料&#xff0c;了解一个知识&#xff0c;帮我们回答问题&#xff0c;编写代码等。此外&#xff0c;在使用ChatGPT时具有一…

二百零四、Flume——登录监听窗口报错Ncat: bind to :::44444: Address already in use. QUITTING.

一、目的 Flume安装好后测试开启监听窗口44444&#xff0c;结果报错Ncat: bind to :::44444: Address already in use. QUITTING. 二、报错详情 Ncat: bind to :::44444: Address already in use. QUITTING. 三、报错原因 经过分析发现&#xff0c;44444窗口已经被占用 […

多线程访问资源计数不正确问题分析

线程1&#xff1a;首先修改状态为-1&#xff0c;然后分配资源&#xff0c;资源分配成功后&#xff0c;修改状态为0 线程2&#xff1a;查询状态为-1&#xff0c;然后分配资源&#xff0c;资源分配成功后&#xff0c;修改状态为0 存在这种情况&#xff0c;在线程1修改状态为-1时&…

数据结构-快速排序“人红是非多”?看我见招拆招

目录 1.快速排序 Hoare版本&#xff1a; 挖坑法&#xff1a; 前后指针版本: 快速排序的时间复杂度 2.快速排序的优化 三数取中法选key 随机数选key 三路划分法 3. 非递归实现快速排序 1.快速排序 快速排序一共有三种版本&#xff1a;Hoare版本、挖坑法、前后指针版本…

腾讯云轻量数据库开箱测评,1核1G轻量数据库测试

腾讯云轻量数据库1核1G开箱测评&#xff0c;轻量数据库服务采用腾讯云自研的新一代云原生数据库TDSQL-C&#xff0c;轻量数据库兼100%兼容MySQL数据库&#xff0c;实现超百万级 QPS 的高吞吐&#xff0c;128TB海量分布式智能存储&#xff0c;虽然轻量数据库为单节点架构&#x…

kettle spoon连接MySQL8.0数据库报错解决方法

kettle 连接 mysql 8.0报错&#xff0c;显示无法连接到数据库服务 错误连接数据库 [11] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the databaseError connecting to database: (using class org.gjt.mm.mysql.D…

斯坦福NLP课程来了

生成式AI&#xff0c;尤其是以ChatGPT为首的大语言模型正在改变人们的生活方式&#xff0c;我想一定有小伙伴想加入NLP这个行列。 微软重磅发布4个适合初学者的机器学习资料 我在前一篇文章中分享了微软人工智能初学者课程&#xff0c;其中的【生成式AI】非常适合初学者&…

利用 Gem5 模拟器创建一个简单的配置脚本——翻译自官网

文章目录 创建简单的配置脚本gem5 配置脚本关于模拟对象的插话 创建配置文件全系统与系统调用模拟 运行Gem5 创建简单的配置脚本 本章教程将指导你如何为 gem5 设置一个简单的模拟脚本&#xff0c;并首次运行 gem5。我们假定你已完成本教程第一章的学习&#xff0c;并已成功创…

重生奇迹mu格斗怎么加点

1.力量加点 力量是格斗家的主要属性之一&#xff0c;它可以增加你的攻击力和物理伤害。因此&#xff0c;对于格斗家来说&#xff0c;力量加点是非常重要的。建议在前期将大部分的加点放在力量上&#xff0c;这样可以让你更快地杀死怪物&#xff0c;提高升级速度。 2.敏捷加点…

Java 环境其他下载2

1 Eclipse Temurin Latest Releases | Adoptium Eclipse Temurin 是由基于 OpenJDK 的开源 Java SE 产生的构建版本。Temurin 适用于 广泛的平台 以及诸多 Java SE 版本。以下列出了推荐用于生产的最新版本&#xff0c;并且定期由 Adoptium 社区发布更新和支持。迁移帮助、容器…

不是说人工智能是风口吗,那为什么工作还那么难找?

最近确实有很多媒体、机构渲染人工智能可以拿高薪&#xff0c;这在行业内也是事实&#xff0c;但前提是你有足够的竞争力&#xff0c;真的懂人工智能。 首先&#xff0c;人工智能岗位技能要求高&#xff0c;人工智能是一个涵盖了多个学科领域的综合性学科&#xff0c;包括数学、…

虹科分享 | 平衡速度与优先级:为多样化的实时需求打造嵌入式网络(3)——CAN与CANopen的实时能力与局限性

在回顾了选择具有实时能力的嵌入式通信系统的基本要求之后&#xff0c;我们现在将更详细地探讨CAN和CANopen的实时能力和局限性。 控制器局域网(CAN)协议是各个行业众多应用的基础&#xff0c;每个应用都有其独特的实时需求。CANopen和J1939等著名示例强调了该协议的多种适应性…

「浙江科聪新品发布」新品发布潜伏顶升式移动机器人专用控制器

聚焦专用车型 最小专用控制器 控制器只占整机5%&#xff0c;纵向出线方式&#xff0c;占比更小 更易插拔 整体解决方案 更具价格优势 提供整体解决方案&#xff0c;配套各类型产品设备及车体厂家 打造持久稳定使用 坚持工业级品质 采用车规级接口&#xff0c;不用其它类不可…

蓄势・前行 | 博格华纳的新能源+战略布局

10月11日-13日&#xff0c;AWC 2023深圳国际新能源及智能网汽车全产业博览会在深圳国际会展中心盛大开幕&#xff0c;此次展会现场共计接待专业观众3W余名&#xff0c;同期举办20场次主题论坛峰会&#xff0c;不仅汇聚众多中外汽车产业巨擘&#xff0c;更是一场涵盖智能驾驶、新…

(内部资料)收下这几个人工智能学习秘籍!

秘籍一&#xff1a;练好基本功 学习基础知识&#xff1a;人工智能涉及多个学科领域&#xff0c;包括数学、计算机科学、统计学等。因此&#xff0c;学习基础知识是非常重要的。您可以通过学习线性代数、概率论和微积分等数学基础知识&#xff0c;以及掌握Python编程语言和常用…

String类常用方法总结

目录 一.简单认识String 二.String对象的比较 1.equals 内部实现原理&#xff1a; 2.compareTo 3.compareToIgnoreCase 三.字符串查找 示例&#xff1a; 四.字符串与其他类型转化 1.数值和字符串相互转换 2.大小写相互转化 3.字符串转数组 4.格式化转化 五.字符串…