当前位置: 首页 > 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;因此…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...