初识数据结构

news2025/1/16 6:00:50

目录

1. 集合的框架

集合框架的重要性

数据结构的介绍

算法的介绍

容器背后对应的数据结构

2. 时间复杂度和空间复杂度

算法效率

时间复杂度

时间复杂度的概念

大O的渐进表示法

常见的时间复杂度的计算

空间复杂度

空间复杂度的概念


从本章开始又要开始新的篇章,本篇章称之为数据结构。我们的数据结构不同于那些课本上的数据结构;我们Java的数据结构将和集合结合在一起,我们从集合的底层开始学起,在“集合的框架”中会将整个知识体系串联起来。另外在本章将补充几个JavaSE的几个知识点。

1. 集合的框架

官方教程:Trail: Collections (The Java™ Tutorials) (oracle.com)https://docs.oracle.com/javase/tutorial/collections/index.html

思维导图:

集合框架的重要性

使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码。

数据结构的介绍

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

算法的介绍

算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

容器背后对应的数据结构

我们主要学习以下容器,每个容器其实都是对某种特定数据结构的封装,大概了解一下,后序会给大家详细讲解并模拟实现

1. Collection:是一个接口,包含了大部分容器常用的一些方法
2. List:是一个接口,规范了ArrayList 和 LinkedList中要实现的方法
ArrayList:实现了List接口,底层为动态类型顺序表
LinkedList:实现了List接口,底层为双向链表
3. Stack:底层是栈,栈是一种特殊的顺序表
4. Queue:底层是队列,队列是一种特殊的顺序表
5. Deque:是一个接口
6. Set:集合,是一个接口,里面放置的是K模型
HashSet:底层为哈希桶,查询的时间复杂度为O(1)
TreeSet:底层为红黑树,查询的时间复杂度为O( ),关于key有序的
7. Map:映射,里面存储的是K-V模型的键值对
HashMap:底层为哈希桶,查询时间复杂度为O(1)
TreeMap:底层为红黑树,查询的时间复杂度为O( ),关于key有序

2. 时间复杂度和空间复杂度

对于同一个问题,有无数种解决方法,那么哪一种解决方法才算是好方法呢?

同样的,同一个问题,有无数种算法,哪一种算法才是好算法?

于是提出了:算法效率

算法效率

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间。

经过多年的发展,我们内存选择已经非常大了,而且相对便宜,我们已经不再那么的关注空间效率了,大多数时候都是以空间换取时间。

时间复杂度

时间复杂度的概念

在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。——百度百科

一个算法所消耗的时间,理论上来说不能直接计算,需要在机器跑起来以后才知道;但是我们所有的算法都需要跑一次吗?确实可以每个算法都运行一遍,但是这无疑会造成误差,例如:每个人的机器不同,可能网络造成的延迟,可能内部零件影响,这都可以造成误差。于是我们规定:一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

大O的渐进表示法

算法的时间复杂度通常用大O符号表述,定义为T[n] = O(f(n))。称函数T(n)以f(n)为界或者称T(n)受限于f(n)。 如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n)。T(n)称为这一算法的“时间复杂度”。当输入量n逐渐加大时,时间复杂度的极限情形称为算法的“渐近时间复杂度”。

举例:

 public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                count++;
            }
        }
        for (int i = 0; i < 100; i++) {
            count++;
        }
        count++;
    }

问:改代码的时间复杂度是多少?

根据数学算法: O(N)= N^2 + N + 1

实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。
大O符号(Big O notation):是用于描述函数渐进行为的数学符号。

推导大O阶方法:

1.  用常数1取代运行时间中的所有加法常数

O(N)= N^2 + N 

2. 只保留最高阶项

O(N)= N^2

3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。 使用大O的渐进表示法以后,该算法的时间复杂度为:

O(N)= N^2

假设算法的N无限大,那么对于最高阶项而言,其他项、常数和系数都不那么重要了。

 public int Function(int n, int x){
        int sum = 0;
        for (int i = 1; i <= n; ++i) {
            if (i == x) 
                break;
            sum += i;
        }
        return sum;
 }

重点分析循环这一段代码,这段代码根据x值的不同,时间复杂度也有区别:

1.当x>n时,此代码的时间复杂度是O(n)。

2.当1<=x<=n时,时间复杂度是一个我们不确定的值,取决于x的值。

3.当x=1时,时间复杂度是O(1)。

这段代码在不同情况下,其时间复杂度是不一样的。所以为了描述代码在不同情况下的不同时间复杂度,我们引入了最好、最坏、平均时间复杂度。

1.最好情况时间复杂度

当我们一次就找到了我们想要的结果。

2..最坏情况时间复杂度

上述示例就是n<x的时候,我们要把整个循环执行一遍。

最好、最坏都是在对应的都是极端情况下的代码复杂度,发生的概率其实并不大。
其中最好、最坏情况下的时间复杂度分析起来比较简单

3..平均时间复杂度

分析上面的示例代码,判断x在循环中出现的位置,有n+1种情况:1<=x<=n 和n<x。
我们将所有情况下代码执行的次数累加起来((1+2+3…+n)+n),然后再除以所有情况数量(n+1),就可以得到需要遍历次数的平均值。

可以参考这个公式,P表示出现的概率,n表示问题规模。 

常见的时间复杂度的计算

举例:

1. O(N)

for (int j = 0; j < N; j++) {
                count++;
            }

2. O(N^2)

for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                count++;
            }
        }

3. O(N^3)

在双重嵌套的情况下再加一层for循环,以此类推。

4. O(log2 N)

log2 其中的2是底数,为了避免歧义后面画图解释。

 int i = 1;
        while (i < N) {
            i *= 2;
        }

5. 线性对数阶O(nlog2n)

for (int j = 0; j < m; j++) {
            int i = 1;
            while (i < N) {
                i *= 2;
            }
        }

6.立方阶O(n³)

7.k次方阶O(n的k次方)

8.指数阶O(2的n次方)

空间复杂度

我们再此不做过多介绍,现在的空间复杂度并非最重要的,我们现在更在乎的是时间的效率。

空间复杂度的概念

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。

分析原则:时间复杂度关注代码的执行次数,而空间复杂度主要关注申请空间的数量

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

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

相关文章

流媒体传输 - RTMP 协议报文分析

握手之后&#xff0c;连接开始对一个或多个 chunk stream 进行合并。创建的每个块都有一个唯一 id 对其进行关联&#xff0c;这个 id 叫做 chunk stream id。这些块通过网络进行传输。传递时&#xff0c;每个块必须被完全发送才可以发送下一块。在接收端&#xff0c;这些块被根…

【毕业设计】深度学习车辆颜色识别检测系统 - python opencv YOLOv5

文章目录1 前言2 实现效果3 CNN卷积神经网络4 Yolov55 数据集处理及模型训练6 最后1 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设…

pytorch初学笔记(十三):神经网络基本结构之Sequential层的使用以及搭建完整的小型神经网络实战

目录 一、Container下Sequential层的介绍 1.1 作用 1.2 Example 二、实战神经网络搭建以及sequential的使用 2.1 前期准备 2.1.1 神经网络模型 2.1.2 求卷积过程中的padding参数 2.2 网络搭建 2.3 sequential的使用 2.4 检验网络正确性 三、完整代码 3.1 控制台输出 …

【Rust日报】2022-11-28 使用 Rust 编写解释型语言

使用 Rust 编写解释型语言这是一本关于使用 Rust 来编写解释型语言的指导书.从理论基础, 内存分配, 真实实践, GC 等方面循序渐进的指导如何使用 Rust 来编写解释型语言.原文链接: https://rust-hosted-langs.github.io/book/introduction.htmlRust的所有权和生命周期这是一篇从…

Java数据审计工具:Envers and JaVers比较

在Java世界中&#xff0c;有两种数据审计工具&#xff1a;Envers和JaVers。 Envers已经存在了很长时间&#xff0c;它被认为是主流。 JaVers提供全新的方法和技术独立性。 如果您考虑哪种工具更适合您的项目&#xff0c;本文是一个很好的起点。 本文分为三个部分。首先&#x…

[附源码]计算机毕业设计springboot电影院网上售票系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

SQL注入漏洞 | bool型

文章目录前言MySQL bool型前言 SQL注入漏洞 | iwebsecSQL注入漏洞 | 数字型参考文章文章所涉及的脚本代码&#xff0c;可以自己动手敲一次&#xff0c;增进理解&#xff0c;形成自己的SQl注入脚本&#xff0c;以后可以不断复用。 MySQL bool型 随便试试看回显 bool注入原理…

毕业设计 单片机LSRB算法的走迷宫小车 - 嵌入式 stm32

文章目录0 前言1 简介2 主要器件3 实现效果4 硬件设计马达驱动器(L298N)Mpu 605060 RPM 直流电机红外传感器Arduino Pro mini5 软件说明“LSRB”算法6 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&a…

小米三季报:手机不振,汽车加码

配图来自Canva可画 ​如果将2022年第一季度的滑落视作气温转冷的话&#xff0c;那么小米的冬天已经持续了三个季度了。 小米不久前发布的2022年第三季度财报显示&#xff0c;小米在第三季度营收、毛利、调整后利润或多或少地都在下降&#xff0c;经营利润更是“扭盈为亏”&am…

Spring Boot Admin 监控指标接入Grafana可视化

其他相关文章&#xff1a; Spring Boot Admin 参考指南SpringBoot Admin服务离线、不显示健康信息的问题Spring Boot Admin2 EnableAdminServer的加载Spring Boot Admin2 AdminServerAutoConfiguration详解Spring Boot Admin2 实例状态监控详解Spring Boot Admin2 自定义JVM监控…

智慧环卫管理系统解决方案(垃圾分类)

1.1 垃圾分类管理子系统 1.1.1 公众参与互动平台 可为客户量身打造微信公众号&#xff0c;搭建互动交流的平台&#xff0c;更好的调动居民参与垃圾分类的热情。 1.1.1.1 分类指导 将目前城市的垃圾处理情况、垃圾分类现状、分类的意义&#xff0c;以数据来说明垃圾分类的…

MyBatis 源码解读 一讲到底

序言 前面大概的介绍了一下mybatis的一些东西&#xff0c;那么现在我们来解析一下Mybatis的源码&#xff0c;就从demo开始 Testpublic void TestExample() throws IOException {String resource "mybatis-config.xml";InputStream inputStream Resources.getResou…

人才资源开发杂志人才资源开发杂志社人才资源开发编辑部2022年第21期目录

开卷有益《人才资源开发》投稿&#xff1a;cnqikantg126.com 年轻干部要走好成长成才之路 赖宁; 1 特别关注 迎难而上 勇担重任 推进河南人事考试高质量发展 常万琦; 6-7 工作要闻 第五届中国河南招才引智创新发展大会开幕 归欣 ;张笑闻; 8 河南省12家企业和2个…

ceph 线程池分析

ceph 线程池 1. WHY 线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用&#xff0c;还能防止…

从ChargePoint到能链智电,充电服务商的价值创新

近日&#xff0c;吉林长春出租车雨雪之中排队换电艰难的视频引起热议。 新能源汽车充换电困难&#xff0c;一方面说明电池在寒冷天气下的性能有优化空间&#xff0c;另一方面也反映出国内新能源汽车配套基础设施仍然存在较大需求缺口。 充电基础设施建设对新能源汽车推广意义…

LabView 总结 持续追加

波形图和波形图表 波形图是同时将所有要显示的点显示出来&#xff0c;接收的数据是数组&#xff0c;当然要显示多条曲线&#xff0c; 波形图表在具有波形图的功能上还有逐点显示&#xff0c;接收数据是一个数值 条件结构 可以用于枚举、字符串、数值 当需要连接两个端点时&a…

[附源码]计算机毕业设计springboot二手书店设计论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 Ma…

聚苏丹红Ⅲ膜/磺化聚醚醚酮膜/ SiO2/Ag纤维复合材料修饰多巴胺的研究

小编在这里给大家整理了聚苏丹红Ⅲ膜/磺化聚醚醚酮膜/ SiO2/Ag纤维复合材料修饰多巴胺的研究&#xff0c;一起来看看吧&#xff01; 聚苏丹红Ⅲ膜修饰多巴胺的研究&#xff1a; 目的建立测定盐酸多巴胺注射液 含量的电化学分析新方法.方法采用循环伏安法研究盐酸多巴胺在膜修饰…

面试汇总-MySQL-杂项

目录 1、悲观锁和乐观锁 2、数据库关键字的执行顺序是什么&#xff1f; 3、SQL优化 3.1、如何进行sql优化&#xff1f; 3.2、常见的join算法 3.2.1、Hash Join 3.2.2、Merge Join 3.2.3、Nested Loop Join 3.3、Join前后表的数据量对查询性能有什么影响&#xff1f; …

云原生架构实践前言

开场白 每个开发人员都可以拥有自己私有的 DEV 环境&#xff0c;方便在业余时间进行探索尝试&#xff0c;学习新的技术&#xff0c;拓宽知识面&#xff0c;保持技术敏感性&#xff0c;不至于被日新月异的快速变革所匆匆淘汰。 自身实力过硬&#xff0c;即使身处激烈的竞争环境&…