初始数据结构

news2025/1/18 20:11:41

目录

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/44396.html

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

相关文章

[附源码]Python计算机毕业设计Django班级事务管理论文2022

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

k8s上部署Harbor通过Nginx-Ingress域名访问

目录 1、k8s集群环境&#xff0c;通过kubesphere安装部署。 1.1 集群基本信息 1.2 集群节点信息 2、安装Harbor 2.1、使用Helm添加Harbor仓库 2.2 、通过openssl生成证书 2.3、 创建secret 2.4、 创建nfs存储目录 2.5、 创建pv 2.6、创建pvc 2.7、values.yaml配置文件 2.…

3-UI自动化-八大元素定位,xpath定位方式和相关的常问面试题

3-UI自动化-八大元素定位&#xff0c;xpath定位方式和相关的常问面试题八大元素定位八大元素定位的使用通过xpath定位xpath语法1. xpath逻辑运算定位2. 层级条件定位3. 索引定位4. 文本定位text()WebElement对象WebElement对象常用属性WebElement对象常用方法find_element()和 …

【Mybatis编程:插入和根据id删除相册数据】

目录 1. Mybatis编程&#xff1a;插入相册数据 2. Mybatis编程&#xff1a;根据id删除相册数据 1. Mybatis编程&#xff1a;插入相册数据 当某个数据表中的id被设计为“自动编号”的&#xff08;auto_increment&#xff09;&#xff0c;在配置<insert>标签时&#xff0…

开心公寓房屋出租管理系统的设计与实现(系统源码+技术文档+论文)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

基于51单片机病房呼叫系统(64位病床)

资料编号&#xff1a;189 下面是仿真演示&#xff1a; 189-基于51单片机病房呼叫系统&#xff08;64位病床&#xff09;&#xff08;仿真源程序原理图全套资料&#xff09;功能介绍&#xff1a; 设计一个可容64张床位的比那个房呼叫系统。 1、每个床位都有一个按钮&#xf…

InnoDB存储引擎简介

InnoDB存储引擎是一种兼顾高可靠性和高性能的通用存储引擎&#xff0c;在MySQL5.5之后&#xff0c;被选为MySQL的默认存储引擎 InnoDB的特点 1 DML操作循环ACID模型&#xff0c;支持事务 这里就印出了我们之前的知识点 DML操作就是我们对数据进行 增删除查改操作 ACID分别代表…

HTML小游戏14 —— H5横版冒险游戏《无限生机》(附完整源码)

&#x1f482; 网站推荐:【神级源码资源网】【摸鱼小游戏】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】&#x1f4ac; 免费且实用的计…

[ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(三)CSRF相关面试题

​ &#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成…

Azure CDN

Azure CDN Azure CDN 是服务器的分发网络&#xff0c;可以将网页内容更高效地分发给终端用户。 CDN在POP点的边缘服务器缓存内容&#xff0c;这样更临近终端用户&#xff0c;延迟低。 Azure CDN 给开发者提供全球解决方案&#xff0c;能够将内容放在全球各个节点&#xff0c;提…

MotoSimEG-VRC软件:龙门架外部设备添加以及示教编程与仿真运行

目录 概述 龙门架添加与属性配置 龙门架软限位设定 龙门架示教编程 仿真运行 概述 龙门架是工业生产中十分常见的自动化设备&#xff0c;由于其具备三维空间内的多自由度运动特性&#xff0c;通常被作为堆垛机&#xff0c;广泛应用在仓储物流领域。也可以作为直角坐标机器…

如何通过 Hardhat 来验证智能合约

在很大程度上&#xff0c;由于部署到通用区块链的智能合约的不变性&#xff0c;安全始终是用户和企业的首要任务。因此&#xff0c;在以太坊上开发智能合约的关键步骤之一是初始部署后的 Etherscan 验证。Etherscan 使任何人&#xff0c;从用户到经验丰富的开发人员和 bug hunt…

计算机组成原理课程设计(1)

指令设计 计算机组成原理课程设计 1、完成以下9条指令的设计&#xff1a; LDI Rd,#data&#xff0c;LDA Rd,adr&#xff0c;STA adr,Rs&#xff0c;LDR Rd,Rs&#xff0c;ADD Rd,Rs&#xff0c;XOR Rd,Rs&#xff0c;JMP adr&#xff0c;JZ adr&#xff0c;HALT 2.指令设计 …

全球著名漫画家蔡志忠创作的“EIS元宇宙之门”数字艺术品限量发售!11.29正式开售

开启宇宙之门 2022年12月3日&#xff0c;EIS我们将一起迎接一个新的爆发机会——品牌将正式接轨元宇宙一个全新的营销时代即将来临&#xff01;首次集结千位元宇宙领域品牌营销头号玩家&#xff0c;找到通往元宇宙智慧的不二法门&#xff01; 品牌营销领域一次全新的风向标&am…

SPARK数据分析

有了 DataFrame 之后&#xff0c;我们该如何在 DataFrame 之上做数据探索、数据分析&#xff0c;以及各式各样的数据转换呢&#xff1f;在数据处理完毕之后&#xff0c;我们又该如何做数据展示与数据持久化呢&#xff1f;今天这一讲&#xff0c;我们就来解答这些疑问。 为了给开…

[附源码]计算机毕业设计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…

操作系统01_进程管理_---软考高级系统架构师006

操作系统的考点;可以看到这里有进程管理 2.存储管理 3.设备管理 4.文件管理 其中比较重要的是进程管理&#xff0c;进程管理中的进程三态图,前趋图,同步与互斥,PV操作,死锁,线程,这个地方考的比较多 ---------------------- 进程的组成: 进程控制块PCB,是进程的唯一标志 T…

阿里云服务器公网带宽计费模式:固定带宽和按使用流量详解

阿里云服务器公网带宽计费模式按固定带宽和按使用流量哪个划算&#xff1f;按固定带宽计费1M带宽一个月23元&#xff0c;按使用流量计费1GB流量0.8元&#xff0c;如果云服务器带宽使用率低于10%&#xff0c;那么首选按使用流量计费&#xff0c;如果带宽实际利用率较高的话&…

自学软件测试必备的英文单词【1500道加语法】

电脑专业英语1500词《电脑专业英语》 1. file n.文件&#xff1b;v.保存文件 2. command n.命令&#xff0c;指令 3. use v.使用&#xff0c;用途 4. program n.程序 5. line n. (数据&#xff0c;程序)行&#xff0c;线路 6. if conj.如果 7. display vt.显示&#xff…

5. 虚拟化特性介绍

5.1 通用虚拟化特性 虚拟化集群特性&#xff08;1&#xff09; 集群&#xff08;cluster&#xff09;&#xff1a;单纯地从集群的角度或用途来说&#xff0c;集群属于网格计算。大家把各自的资源&#xff08;如&#xff1a;服务器提供了自己的计算资源、网络资源、存储资源&am…