小怡分享之数据结构基础知识准备
前言:
🌈✨之前小怡给大家分享了JavaSE的知识,今天小怡要给大家分享一下数据结构基础知识。
一、初识集合框架
1.什么是集合框架
Java集合框架Java Collection Framework, 又称为容器container,是定义在Java.util 包下的一组接口interfaces和其实现类classes。
其主要表现为将多个元素elment置于一个单元中,用于对这些元素进行快速、便捷的存储store、检索retrieve、管理manipulate,即平时我们俗称的增删查改CRUD。
2.集合框架的重要性
- 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码;
- 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景。
3.背后所涉及的数据结构以及算法
3.1 什么是数据结构
数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
3.2 相关Java知识
- 泛型Generic;
- 自动装箱autobox和自动拆箱autounbox;
- Object的equals方法;
- Comparable和Comparator接口。
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,则去除与这个项目相乘的常数。得到的结果就是大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 基本数据类型和对应的包装类
| 基本数据类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
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;
}
🌈✨今天的分享到这里结束啦,小怡和大家一起分享一起进步一起学习,“成功的秘诀在于坚持自己的目标和信念”。
相关文章:
小怡分享之数据结构基础知识准备
前言: 🌈✨之前小怡给大家分享了JavaSE的知识,今天小怡要给大家分享一下数据结构基础知识。 一、初识集合框架 1.什么是集合框架 Java集合框架Java Collection Framework, 又称为容器container,是定义在Java.util 包…...
Linux安全与高级应用(三)深入探索MySQL数据库:安装、管理与安全实践
文章目录 深入探索MySQL数据库:安装、管理与安全实践MySQL数据库简介MySQL的安装与配置编译安装MySQL配置MySQL服务 MySQL数据库的基本操作数据库的创建与删除表的创建与管理数据记录的增删改查 MySQL用户管理与权限设置MySQL数据库的备份与恢复数据库备份数据库恢复…...
基于jsp的宠物领养与服务管理系统(源码+论文+部署讲解等)
博主介绍:✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍:我是程序员阿龙ÿ…...
基于STM32F407+NBIOT+华为云IOT平台设计的环境检测系统
基于STM32F407NBIOT华为云IOT平台设计的环境检测系统实现的功能: 【1】能够采集本地环境的温度、湿度、烟雾浓度,火光信息,在OLED显示屏上显示。 如果检测到烟雾、温度、火光超过阀值会触发蜂鸣器报警。 【2】能够通过NBIOT将本地设备采集的信…...
工具方法 - 如何表扬小孩子
赞扬小朋友的表现可以通过多种方法来进行,以鼓励他们的积极行为和努力,增强他们的自信心和动力。以下是一些有效的赞扬方法: 1. 具体表扬:指出具体的行为或成就,而不是泛泛地说“你很棒”。例如,“你今天很…...
【扒模块】DySample
逐行注释 import torch import torch.nn as nn import torch.nn.functional as F import warnings# 忽略警告信息,这通常用于开发过程中,避免警告干扰输出结果 warnings.filterwarnings(ignore)# 定义一个函数,用于对神经网络模块的权重进行…...
数学建模之数据分析【四】:变量及其分析
文章目录 一、单变量数据1.1 单变量数据1.2 单变量分析的要点: 二、双变量数据2.1 双变量数据2.2 双变量分析的要点 三、多元数据3.1 多元数据3.2 多元分析的要点 四、单变量,双变量和多变量数据之间的区别 公众号/小红书: 快乐数模 CSDN: 清上尘 本文&a…...
iOS ------ UIKit相关
UIView和CALayer UIView UIView表示屏幕上的一块矩形区域,它是基本上iOS中所有可视化控件的父类。UIView可以管理矩形区域里的内容,处理矩形区域的事件,包括子视图的管理以及动画的实现。 UIKit相关类的继承关系 UIView继承自UIResponde…...
24/8/9算法笔记 随机森林
"极限森林"(Extremely Randomized Trees,简称ERT)是一种集成学习方法,它属于决策树的变体,通常被归类为随机森林(Random Forest)的一种。极限森林的核心思想是在构建决策树时引入极端…...
如何在前后端分离项目中,使用Spring Security
使用 WebSecurityConfigurationAdapter 在前后端分离的架构中,通常使用 Token 进行认证和授权是一种常见的做法。Token 可以是 JSON Web Token(JWT),用于在客户端和服务器之间传递身份信息和访问控制信息。下面我将详细介绍如何在…...
c#怎么折叠代码快捷
在C#中,你可以使用快捷键来折叠或展开代码,以便更好地管理和浏览代码。以下是一些常用的快捷键: 折叠所有方法:使用Ctrl M O。折叠或展开当前方法:使用Ctrl M M。展开所有方法:使用…...
数据库篇--八股文学习第十七天| 什么是慢查询?原因是什么?可以怎么优化?;undo log、redo log、binlog 有什么用?
1、什么是慢查询?原因是什么?可以怎么优化? 答: 数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。 原因: 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询&…...
插件、cookie存储,json,ajax详解
1.插件 下载地址:http://github.com/carhartl/jquery-cookie/zipball/v1.4.1 使用文档:jquery-cookie(github.com) 2.存储 初学前端用的是localStorage和sessionStorage,后来又引入了cookie进行存储。 localStorage使用如下 sessionStor…...
快速上手Spring Boot
快速上手Spring Boot (qq.com)...
思路超清晰的 LVS-NAT 模式实验部署
目录 一、实验原理 1、实验基础配置图 2、实验原理 二、实验环境准备 1、准备四台红帽9的主机 2、四台主机的基础配置 (1)client 1)配置主机名:client 2)配置ip:172.25.254.200 (2)lv…...
Android实时通信:WebSocket与WebRTC的应用与优化
文章目录 一、WebSocket在Android中的应用1.1 简介1.2 示例 二、WebRTC在Android中的应用2.1 简介2.2 示例 三、Android实时通信的优化策略3.1 网络优化3.2 延迟降低 四、Android实时通信的安全问题五、实时通信协议的比较六、总结 在现代移动应用中,实时通信已经成…...
力扣刷题之3131.找出与数组相加的整数I
题干描述 给你两个长度相等的数组 nums1 和 nums2。 数组 nums1 中的每个元素都与变量 x 所表示的整数相加。如果 x 为负数,则表现为元素值的减少。 在与 x 相加后,nums1 和 nums2 相等 。当两个数组中包含相同的整数,并且这些整数出现的频…...
非线性表之堆的实际应用和二叉树的遍历
目录 前言:前一篇我已经介绍过了二叉树和堆的介绍和相关代码的实现 一、堆的实现 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 模块中的一个函数,用于将文件名分割成两部分:文件名和扩展名。这个函数非常有用,特别是在处理文件路径和文件扩展名时。 二、语法和参数 语法: os.path…...
Python知识点:如何使用Sqlmap进行SQL注入测试
使用 Sqlmap 进行 SQL 注入测试是一个非常有效的方法,它可以帮助你自动化地检测和利用 SQL 注入漏洞。以下是使用 Sqlmap 进行 SQL 注入测试的详细步骤: 1. 安装 Sqlmap 首先,你需要安装 Sqlmap。Sqlmap 是一个 Python 工具,因此…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
