当前位置: 首页 > news >正文

小怡分享之数据结构基础知识准备

前言:

        🌈✨之前小怡给大家分享了JavaSE的知识,今天小怡要给大家分享一下数据结构基础知识。

一、初识集合框架

1.什么是集合框架 

           Java集合框架Java Collection Framework, 又称为容器container,是定义在Java.util 包下的一组接口interfaces和其实现类classes

       其主要表现为将多个元素elment置于一个单元中,用于对这些元素进行快速、便捷的存储store、检索retrieve、管理manipulate,即平时我们俗称的增删查改CRUD

2.集合框架的重要性 

  • 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码;
  • 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景。 

3.背后所涉及的数据结构以及算法 

3.1  什么是数据结构 

        数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 

3.2  相关Java知识 

  1. 泛型Generic
  2. 自动装箱autobox和自动拆箱autounbox
  3. Objectequals方法;
  4. ComparableComparator接口。

3.3  什么是算法 

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

二、时间和空间复杂度 

1.算法效率 

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

2.时间复杂度 

2.1  时间复杂度的概念 

        在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。 

2.2   大O的渐进表示法 

       计算一下fun1基本操作执行了多少次:

 void fun1 ( 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);}

 fun1执行的基本操作次数:

                            F(N)=N^2+2*N+10

        实际上我们计算时间复杂度时,只需要大概执行次数,那么这里我们使用大O的渐进表示法。

        大O符号:是用于描述函数渐进行为的数学符号。 

2.3   推导大O阶方法 

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

         我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。另外有些算法的时间复杂度存在最好、平均和最坏情况: 

最坏情况:任意输入规模的最大运行次数(上界);

平均情况:任意输入规模的最小运行次数;

最好情况:任意输入规模的最小运行次数(下界);

         平时所有的时间复杂度/空间复杂度,都是指在最坏情况下。

2.4   常见的时间复杂度计算举例 

 【实例1】

            基本操作执行了2N+10次,通过推导大O阶方法知道,时间复杂度为O(N) 

【实例2】

             基本执行力M+N次,有两个未知数M和N,时间复杂度为O(M+N) 

【实例3】 

          基本操作执行了100次,通过推导大O阶方法,时间复杂度为O(1)

【实例4】

long factorial(int N){return N<2?N:factorial(N-1)*N;
}

       通过计算分析发现基本操作递归了N次,时间复杂度为O(N)

【实例5】 

int factorial(int N){return N<2?N:fibonacci(N-1)+fibonacci(N-2);
}

       通过计算分析发现基本操作递归了2^N次,时间复杂度为O(2^N)

3.空间复杂度 

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

【实例】

int[] fibonacci(int n){long[] fibArray=new long[n+1];fibArray[0]=0;fibArray[1]=1;for(int i=2;i<=n;i++){fibArray[i]=fibArray[i-1]+fibArray[i-2];}return fibArray;
}

          开辟了N个空间,空间复杂度为O(N)。 

 三、包装类&认识泛型

1.包装类 

          在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。

1.1   基本数据类型和对应的包装类 

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

 

1.2   装箱/装包和拆箱/拆包 

       装箱:把基本数据类型变为包装类类型的过程。

       装箱操作:新建一个Integer类型对象,将的值放入对象的某个属性。 

int a=10;
Integer i=Integer.valueOf(a);//显示装箱
Integer i2=10;//自动装箱,隐式装箱

 

        拆箱:把包装类类型变为基本数据类型的过程。

       拆箱操作:将Integer对象中的值取出,放到一个基本数据类型中。 

Integer a=10;
int b=a;//自动拆箱
int c=a.intValue();//显示拆箱

 

2.泛型 

         一般的类和方法,只能使用具体的类型:要么是基本的类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚会很大。

        泛型:就是适用于许多类型。从代码上讲,就是对类型实现了参数化。 

       泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去检查。 

 

2.1   语法 

class 泛型类名称<类型形参列表>{

     //这里可以使用类型参数

}

class ClassName<T1,T2,……,Tn>{

}

class 泛型类名称<类型形参列表> extends 继承类{

     //这里可以使用类型参数

}

class ClassName<T1,T2……,Tn> extends ParentClass<T1>{

      //可以只使用部分类型参数

}

  

  • E表示Element;
  • K表示Key;
  • V表示Value;
  • N表示Number;
  • T表示Type;
  • S、U、V等等-第二、第三、第四个类型。 

 

3.泛型类的使用 

3.1   语法 

泛型类 <类型实参>变量名;//定义一个泛型类引用

new 泛型类<类型实参>(构造方法实参);//实例化一个泛型类对象 

【实例】

MyArray<Integer>list=new MyArray<Integer>();

 

3.2  类型推导 

        当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写。

MyArray<Integer>list=new MyArray<Integer>();

        可以推导出实例化需要的类型实参为Integer。 

 

4.泛型的上界 

      在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

4.1   语法 

class 泛型类名称<类型形参 extends 类型边界>{

【实例】

public class MyArray<E extends Number>{}

             只接受Number的子类作为E的类型实参。没有指定类型边界E,可以视为E extends Object。 

 【复杂实例】

public class MyArray<E extends Comparable<E>>{
}

           E必须是实现类Comparable接口的。 

 

5.泛型方法 

5.1  定义语法 

方法限定符<类型形参列表>返回值类型 方法名称(形参列表){

public static <E> void swap(E[] array,int i,int j){E t=array[i];array[i]=array[j];array[j]=t;
}

 

🌈✨今天的分享到这里结束啦,小怡和大家一起分享一起进步一起学习,“成功的秘诀在于坚持自己的目标和信念”。 

 

 

 

相关文章:

小怡分享之数据结构基础知识准备

前言&#xff1a; &#x1f308;✨之前小怡给大家分享了JavaSE的知识&#xff0c;今天小怡要给大家分享一下数据结构基础知识。 一、初识集合框架 1.什么是集合框架 Java集合框架Java Collection Framework&#xff0c; 又称为容器container&#xff0c;是定义在Java.util 包…...

Linux安全与高级应用(三)深入探索MySQL数据库:安装、管理与安全实践

文章目录 深入探索MySQL数据库&#xff1a;安装、管理与安全实践MySQL数据库简介MySQL的安装与配置编译安装MySQL配置MySQL服务 MySQL数据库的基本操作数据库的创建与删除表的创建与管理数据记录的增删改查 MySQL用户管理与权限设置MySQL数据库的备份与恢复数据库备份数据库恢复…...

基于jsp的宠物领养与服务管理系统(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…...

基于STM32F407+NBIOT+华为云IOT平台设计的环境检测系统

基于STM32F407NBIOT华为云IOT平台设计的环境检测系统实现的功能&#xff1a; 【1】能够采集本地环境的温度、湿度、烟雾浓度&#xff0c;火光信息&#xff0c;在OLED显示屏上显示。 如果检测到烟雾、温度、火光超过阀值会触发蜂鸣器报警。 【2】能够通过NBIOT将本地设备采集的信…...

工具方法 - 如何表扬小孩子

赞扬小朋友的表现可以通过多种方法来进行&#xff0c;以鼓励他们的积极行为和努力&#xff0c;增强他们的自信心和动力。以下是一些有效的赞扬方法&#xff1a; 1. 具体表扬&#xff1a;指出具体的行为或成就&#xff0c;而不是泛泛地说“你很棒”。例如&#xff0c;“你今天很…...

【扒模块】DySample

逐行注释 import torch import torch.nn as nn import torch.nn.functional as F import warnings# 忽略警告信息&#xff0c;这通常用于开发过程中&#xff0c;避免警告干扰输出结果 warnings.filterwarnings(ignore)# 定义一个函数&#xff0c;用于对神经网络模块的权重进行…...

数学建模之数据分析【四】:变量及其分析

文章目录 一、单变量数据1.1 单变量数据1.2 单变量分析的要点&#xff1a; 二、双变量数据2.1 双变量数据2.2 双变量分析的要点 三、多元数据3.1 多元数据3.2 多元分析的要点 四、单变量&#xff0c;双变量和多变量数据之间的区别 公众号/小红书: 快乐数模 CSDN: 清上尘 本文&a…...

iOS ------ UIKit相关

UIView和CALayer UIView UIView表示屏幕上的一块矩形区域&#xff0c;它是基本上iOS中所有可视化控件的父类。UIView可以管理矩形区域里的内容&#xff0c;处理矩形区域的事件&#xff0c;包括子视图的管理以及动画的实现。 UIKit相关类的继承关系 UIView继承自UIResponde…...

24/8/9算法笔记 随机森林

"极限森林"&#xff08;Extremely Randomized Trees&#xff0c;简称ERT&#xff09;是一种集成学习方法&#xff0c;它属于决策树的变体&#xff0c;通常被归类为随机森林&#xff08;Random Forest&#xff09;的一种。极限森林的核心思想是在构建决策树时引入极端…...

如何在前后端分离项目中,使用Spring Security

使用 WebSecurityConfigurationAdapter 在前后端分离的架构中&#xff0c;通常使用 Token 进行认证和授权是一种常见的做法。Token 可以是 JSON Web Token&#xff08;JWT&#xff09;&#xff0c;用于在客户端和服务器之间传递身份信息和访问控制信息。下面我将详细介绍如何在…...

c#怎么折叠代码快捷

在C#中&#xff0c;‌你可以使用快捷键来折叠或展开代码&#xff0c;‌以便更好地管理和浏览代码。‌以下是一些常用的快捷键&#xff1a;‌ 折叠所有方法&#xff1a;‌使用Ctrl M O。‌折叠或展开当前方法&#xff1a;‌使用Ctrl M M。‌展开所有方法&#xff1a;‌使用…...

数据库篇--八股文学习第十七天| 什么是慢查询?原因是什么?可以怎么优化?;undo log、redo log、binlog 有什么用?

1、什么是慢查询&#xff1f;原因是什么&#xff1f;可以怎么优化&#xff1f; 答&#xff1a; 数据库查询的执行时间超过指定的超时时间时&#xff0c;就被称为慢查询。 原因&#xff1a; 查询语句比较复杂&#xff1a;查询涉及多个表&#xff0c;包含复杂的连接和子查询&…...

插件、cookie存储,json,ajax详解

1.插件 下载地址&#xff1a;http://github.com/carhartl/jquery-cookie/zipball/v1.4.1 使用文档&#xff1a;jquery-cookie(github.com) 2.存储 初学前端用的是localStorage和sessionStorage&#xff0c;后来又引入了cookie进行存储。 localStorage使用如下 sessionStor…...

快速上手Spring Boot

快速上手Spring Boot (qq.com)...

思路超清晰的 LVS-NAT 模式实验部署

目录 一、实验原理 1、实验基础配置图 2、实验原理 二、实验环境准备 1、准备四台红帽9的主机 2、四台主机的基础配置 &#xff08;1&#xff09;client 1&#xff09;配置主机名&#xff1a;client 2&#xff09;配置ip:172.25.254.200 &#xff08;2&#xff09;lv…...

Android实时通信:WebSocket与WebRTC的应用与优化

文章目录 一、WebSocket在Android中的应用1.1 简介1.2 示例 二、WebRTC在Android中的应用2.1 简介2.2 示例 三、Android实时通信的优化策略3.1 网络优化3.2 延迟降低 四、Android实时通信的安全问题五、实时通信协议的比较六、总结 在现代移动应用中&#xff0c;实时通信已经成…...

力扣刷题之3131.找出与数组相加的整数I

题干描述 给你两个长度相等的数组 nums1 和 nums2。 数组 nums1 中的每个元素都与变量 x 所表示的整数相加。如果 x 为负数&#xff0c;则表现为元素值的减少。 在与 x 相加后&#xff0c;nums1 和 nums2 相等 。当两个数组中包含相同的整数&#xff0c;并且这些整数出现的频…...

非线性表之堆的实际应用和二叉树的遍历

目录 前言&#xff1a;前一篇我已经介绍过了二叉树和堆的介绍和相关代码的实现 一、堆的实现 1.1堆向上调整算法 1.2堆向下调整算法 二、堆的应用 2.1堆的排序 2.2TOP-K问题 三、二叉树的遍历 3.1 二叉树的创建 3.2遍历介绍 3.3前序遍历 3.4中序遍历 3.5后序遍历 …...

os.path库学习之splitext函数

os.path库学习之splitext函数 一、简介 os.path.splitext 是 Python 标准库 os.path 模块中的一个函数&#xff0c;用于将文件名分割成两部分&#xff1a;文件名和扩展名。这个函数非常有用&#xff0c;特别是在处理文件路径和文件扩展名时。 二、语法和参数 语法: os.path…...

Python知识点:如何使用Sqlmap进行SQL注入测试

使用 Sqlmap 进行 SQL 注入测试是一个非常有效的方法&#xff0c;它可以帮助你自动化地检测和利用 SQL 注入漏洞。以下是使用 Sqlmap 进行 SQL 注入测试的详细步骤&#xff1a; 1. 安装 Sqlmap 首先&#xff0c;你需要安装 Sqlmap。Sqlmap 是一个 Python 工具&#xff0c;因此…...

2026在线测评系统十大量表对比:信效度与场景全解析

【30s 核心摘要】2026 年在线测评成人才管理刚需&#xff0c;信效度与场景适配成选型核心。本文聚焦十大量表&#xff0c;从信度、效度、适配场景等维度深度对比&#xff0c;重点解析问卷星、北森、金数据等主流平台的量表能力与落地效果&#xff0c;为企业、高校及机构提供科学…...

我靠这个测试设计方法,把漏测率降低了80%

当“直觉测试”撞上南墙很长一段时间里&#xff0c;我和许多测试同行一样&#xff0c;测试用例的设计主要依靠两样东西&#xff1a;需求文档和“测试直觉”。这种模式在业务逻辑相对简单、迭代速度平缓时还能勉强应付。一旦面对复杂的企业级应用、高频的敏捷迭代&#xff0c;或…...

Unity发行版DLL调试实战:DnSpy无源码IL级断点指南

1. 这不是“反编译”&#xff0c;而是Unity游戏开发者的日常调试手段你有没有遇到过这样的情况&#xff1a;接手一个Unity发行版游戏&#xff0c;想快速验证某个功能逻辑是否按预期执行&#xff0c;或者排查一个偶发的崩溃&#xff0c;但手头只有打包后的Assembly-CSharp.dll&a…...

AI学习 - 大模型基础入门

AI学习 - 大模型基础入门 从零开始&#xff1a;Ollama 安装 → 本地模型运行 → Python 代码接入 → 理解核心概念 摘要 本文记录了在 Windows 上使用 Ollama 部署本地大模型、并通过 Python 代码接入调用的完整过程。内容涵盖&#xff1a;Ollama 安装与模型拉取、大模型基础概…...

Burp Suite拦截与替换机制深度解析:从协议层到规则链

1. 这不是“点开就能用”的功能&#xff0c;而是你和目标系统之间的一道可编程闸门很多人第一次在Burp Suite里点开Proxy → Intercept&#xff0c;看到HTTP请求被拦下来&#xff0c;兴奋地改个User-Agent、删个Cookie就点Forward&#xff0c;以为自己已经掌握了“拦截与替换”…...

用Azure Kinect DK和Body Tracking SDK,5分钟实现一个实时人体骨骼点检测Demo(C++版)

5分钟实战&#xff1a;用Azure Kinect DK实现实时人体骨骼点追踪&#xff08;C版&#xff09; 当你第一次拿到Azure Kinect DK时&#xff0c;最令人兴奋的莫过于它强大的人体追踪能力。这款深度相机不仅能捕捉高清彩色图像&#xff0c;更能通过AI算法实时重建人体骨骼关节点。本…...

别再手动测模型了!用Simulink Test Manager实现自动化测试(附Excel表格配置详解)

从手动测试到智能验证&#xff1a;Simulink Test Manager全流程自动化实战指南 在模型开发的迭代过程中&#xff0c;工程师们常常陷入"修改-测试-记录"的循环泥潭。每次参数调整后&#xff0c;手动运行模型、记录数据、比对结果不仅消耗大量时间&#xff0c;更可能因…...

在模型广场灵活选型让我找到了更适合代码生成的Taotoken模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在模型广场灵活选型让我找到了更适合代码生成的Taotoken模型 开发代码辅助工具时&#xff0c;选择合适的模型是平衡效果与成本的关…...

JWT弱密钥爆破实战:从HS256签名原理到CTF权限提升

1. 这不是密码学考试&#xff0c;而是一场“密钥猜谜”实战JWT&#xff08;JSON Web Token&#xff09;在现代Web系统中早已不是可选项&#xff0c;而是默认配置。登录成功后返回一串形如eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsIm5hbWUiOiLnlKjliYkiLCJpYX…...

Keil µVision反汇编窗口内容导出方案与调试技巧

1. 问题背景与需求解析在嵌入式开发过程中&#xff0c;调试环节往往占据大量时间。Keil Vision作为业界广泛使用的集成开发环境(IDE)&#xff0c;其调试器功能强大但某些细节功能仍有提升空间。最近我在使用C251架构开发汽车电子控制单元时&#xff0c;就遇到了一个看似简单却影…...