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;希望对大家有所帮助。北京木奇移动技术有…

bind、apply、call 的区别

一、作用 call 、apply 、bind 作用是改变函数执行时的上下文&#xff0c;简而言之就是改变函数运行时的this指向 那么什么情况下需要改变this的指向呢&#xff1f;下面举个例子 const name"lucy"; const obj{name:"martin",say:function () {console.l…

redis之数据类型

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

接口请求没有到达后端,被缓存怎么办

解决方法&#xff1a;在请求的headers中加 ‘Cache-Control’: ‘no-cache’ } export const getDrawChanceApi activityUuid > {return request.get(/lottery/userJoinedCount/${activityUuid}, { headers: { Cache-Control: no-cache } }) }

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

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

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

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

语音识别技术paddlespeech的安装和使用

PaddleSpeech 介绍 PaddleSpeech是百度飞桨&#xff08;PaddlePaddle&#xff09;开源深度学习平台的其中一个项目&#xff0c;它基于飞桨的语音方向模型库&#xff0c;用于语音和音频中的各种关键任务的开发&#xff0c;包含大量基于深度学习前沿和有影响力的模型。PaddleSpe…

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窗口已经被占用 […

变频器基础问答集21-50

21&#xff0e;请问电机软起动器是否能节能?软启动节能效果有限&#xff0c;但可以减少启动对电网的冲击&#xff0c;也可以实现平滑启动&#xff0c;保护电机机组。 根据能量守恒理论,由于加入了相对复杂的控制电路,软启动不但不节能,还会加大能量的消耗,但它可以减小电路的启…

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

线程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版本、挖坑法、前后指针版本…

很多Python脚本开头的“#!/usr/bin/env python”是什么意思?

#!/usr/bin/env python 是一个在 Unix-like 操作系统中用于指定脚本解释器的特殊语法。这一行通常被称为"shebang"&#xff08;井号和叹号的组合&#xff0c;#!&#xff09;&#xff0c;其目的是告诉系统使用指定的解释器来执行脚本。 具体来说&#xff0c;#!/usr/b…

SpEL 表达式 是什么

SpEL&#xff08;Spring Expression Language&#xff09;是一种强大的表达式语言&#xff0c;用于在运行时查询和操作对象图。它是 Spring 框架的一部分&#xff0c;但也可以独立于 Spring 使用。SpEL 提供了丰富的特性集&#xff0c;包括对象图遍历、方法调用、算术、逻辑和关…

实时定位系统有哪些好处?

好处包括&#xff1a; 更好的库存管理 - 找到丢失的库存&#xff0c;并收回更换它所需的成本&#xff0c;恢复寻找它所损失的工作时间&#xff0c;或消除例行库存检查的计划外停机。 所有这些都在工厂环境中创造价值&#xff0c;通过节省工厂工人的时间来避免不必要的更换&…

Django--重定向redirect

在 Django 中&#xff0c;redirect 是一个用于进行重定向的函数。它允许你将用户从一个 URL 重定向到另一个 URL&#xff0c;通常用于处理表单提交、用户登录、用户注册等操作后的页面跳转。redirect 函数属于 django.shortcuts 模块。 以下是 redirect 函数的基本用法和一些参…

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

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

python:list对象的全部详细行为(每一个都有详细讲解)保证一看就会

python&#xff1a;list类型中所有的方法&#xff0c;每一种方法附带一个实例&#xff1a;以及解释说明 文章目录 python&#xff1a;list类型中所有的方法&#xff0c;每一种方法附带一个实例&#xff1a;以及解释说明list类型中所有的方法&#xff08;行为&#xff09;获取方…

excel表格忘记密码,如何找回?

找回和去除Excel表格密码的方法非常简单。具体步骤如下&#xff1a;第一步百度搜索【 密码帝官网 】&#xff0c;第二步点击“立即开始”在用户中心上传文件即可。这个方法既安全又简单&#xff0c;不需要下载任何软件&#xff0c;而且可以在手机和电脑上都使用。密码帝官网支持…

解除word文档限制,快速操作,步骤简单,不可错过。

想找回忘记的word文档密码或去除word文档密码吗&#xff1f;别担心&#xff01;为您提供最简便的解决方案。具体步骤如下&#xff1a;第一步&#xff0c;打开电脑或手机&#xff0c;并打开您的百度搜索引擎。第二步&#xff0c;在搜索栏中输入“密码帝官网”。第三步&#xff0…