数据结构青铜到王者第一话---数据结构基本常识(1)

目录

一、集合框架

1、什么是集合框架

2、集合框架的重要性

2.1开发中的使用

2.2笔试及面试题

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

3.1什么是数据结构

3.2容器背后对应的数据结构

3.3相关java知识

3.4什么是算法

3.5如何学好数据结构以及算法

二、时间和空间复杂度

1、算法的效率

2、时间复杂度

2.1时间复杂度的概念

2.2大O的渐进表示法

2.3推导大O阶方法

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

三、空间复杂度


一、集合框架

1、什么是集合框架

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

        主要表现为把多个元素(element)放在一个单元中,用于对这些元素进行快速、便捷的存储(store)、检索(retrieve)、管理(manipulate),即平时俗称的增删改查(CRUD)

类和接口总览:

2、集合框架的重要性

2.1开发中的使用

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

(2)学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景

2.2笔试及面试题

        在各厂的秋招中,常会用数据结构作为笔试的考题;不仅如此,哪怕是在面试中,也常常会问到我们一些数据结构相关的问题!!!

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

3.1什么是数据结构

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

3.2容器背后对应的数据结构

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

(1)Collection:一个接口,包含了大部分容器常用的一些方法

(2)List:一个接口,规范了ArrayList和LinkedList中要实现的方法

                        ArrayList:实现了List接口,底层为动态类型顺序表

                        LinkedList:实现了List接口,底层为双向链表

(3)Stack:底层是栈,栈是一种特殊的顺序表

(4)Queue:底层是队列,队列是一种特殊的顺序表

(5)Deque:是一个接口

(6)Set:集合,是一个接口,里面放置的是K模型

                        HashSet:底层为哈希桶,查询的时间复杂度为O(1)

                        TreeSet:底层为红黑树,查询的时间复杂度为O( logN ),关于key有序的

(7)Map:映射,里面存储的是K-V模型的键值对

                         HashMap:底层为哈希桶,查询时间复杂度为O(1)

                         TreeMap:底层为红黑树,查询的时间复杂度为O(logN),关于key有序

3.3相关java知识

(1)泛型 (Generic)

(2)自动装箱 (autobox) 和自动拆箱 (autounbox)

(3)Object 的 equals 方法

(4)Comparable 和 Comparator 接口

3.4什么是算法

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

3.5如何学好数据结构以及算法

        不少人都会问:怎么才能学会学好数据结构呢???

(1)死磕代码,磕成这样就可以了

(2)注意画图和思考

        在我看来,学数据结构主要分为这样的过程:

思考==>画图==>写代码(N)==>画图==>再次写代码==>调试==>……

#注:一定要画图!!!一定要画图!!!一定要画图!!!

(3)多看两遍我的博客或者自己写点的东西(如博客),多做总结

(4)多刷题

        可以在牛客网和LeetCode上面刷一下相关的数据结构,看一下不同的解题思路!!!

二、时间和空间复杂度

        首先要明确,我们不只是说只要可以实现、完成任务就可以,而是要尽可能用更少的时间、更少的空间来完成任务!!!(就像是干活一样,不仅要老板满意,还要在保证质量的情况下用最短的时间以及最少的成本完成工作,让利益最大化!!!)

1、算法的效率

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

(在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计 算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。但是,一些面试题或者笔试题中有要求!!!)

2、时间复杂度

2.1时间复杂度的概念

        时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度

2.2大O的渐进表示法

 // 请计算一下func1基本操作执行了多少次?void func1(int N){int count = 0;for (int i = 0; i < N ; i++) {for (int j = 0; j < N ; j++) {count++;}}//N^2for (int k = 0; k < 2 * N ; k++) {count++;}//2*Nint M = 10;while ((M--) > 0) {count++;}//10System.out.println(count);}

Func1 执行的基本操作次数 :

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

(1)N = 10       F(N) = 130

(2)N = 100     F(N) = 10210

(3)N = 1000   F(N) = 1002010

        实际我们计算时间复杂度时,我们只需要算大概执行的次数,也就是大O的渐进表示法

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

2.3推导大O阶方法

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

(2)在修改后的运行次数函数中,只保留最高阶项(只保留最高相)

(3)如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。(系数变成1)

        使用大O的渐进表示法以后,Func1的时间复杂度为:O(N^2)

(1)N = 10       F(N) = 100

(2)N = 100     F(N) = 10000

(3)N = 1000   F(N) = 1000000

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

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

        平均情况:任意输入规模的期望运行次数

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

如:在一个长度为N数组中搜索一个数据x

        最好情况:1次找到

        最坏情况:N次找到

        平均情况:N/2次找到

 在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

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

实例1:

void func3(int N, int M) {int count = 0; for (int k = 0; k < M; k++) {count++;//M} for (int k = 0; k < N ; k++) {count++;//N} System.out.println(count);}

        由于基本操作执行了N+M次,并且两数都是未知数,所以时间复杂度为O(N+M)

实例二:

void bubbleSort(int[] array) {for (int end = array.length; end > 0; end--) {boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {Swap(array, i - 1, i);sorted = false;}//N*(N-1)/2} if (sorted == true) {break;}}}

        由于循环执行,第一次执行(N-1)次,最后一次执行了0次,共N次,求每次比前一次少一次,因此得到N*(N-1)/2,因此时间复杂度为O(N^2)

实例三:

int binarySearch(int[] array, int value) {int begin = 0;int end = array.length - 1;while (begin <= end) {int mid = begin + ((end-begin) / 2);if (array[mid] < value)begin = mid + 1;else if (array[mid] > value)end = mid - 1;elsereturn mid;}return -1;}

        二分查找,一次是原来的一半可以得出(N/2)^O=1,计算可得时间复杂度为O(logN)(logN是以2为底,lgN是以10为底)

实例四:

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

        阶乘递归是在比较N和2的大小关系进行选择,可以发现共递归了N次,所以时间复杂度为O(N)

实例五:

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

        我们可以发现,左侧最顶端(第一次)是(N-1),最后一次是1,也就可以得到近似的1+2^1+……+2^(N-1),也就是2^N-1,同理,右侧也可以计算出是2^(N-1)-1,因此时间复杂度为O(2^N)

        我们常遇到的复杂度有:O(1) < O(logN) < O(N) < O(N*logN) < O(N^2)

三、空间复杂度

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

实例一:

void bubbleSort(int[] array) {for (int end = array.length; end > 0; end--) {boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {Swap(array, i - 1, i);sorted = false;}}if (sorted == true) {break;}}
}

        因为使用了常数个额外空间,所以空间复杂度为O(1)

实例二:

 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)

实例三:

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

因为递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间,因此空间复杂度为O(N)

                 由于内容较多,会分为多篇讲解,预知后续内容,请看后续博客!!!

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

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

相关文章

【Verilog】延时和时序检查

Verilog中延时和时序检查1. 延时模型1.1 分布延迟1.2 集总延迟1.3 路径延迟2. specify 语法2.1 指定路径延时基本路径延时边沿敏感路径延时状态依赖路径延时2.2 时序检查$setup, $hold, $setuphold$recovery, $removal, $recrem$width, $periodnotifier1. 延时模型 真实的逻辑元…

DigitalOcean Gradient AI平台现已支持OpenAI gpt-oss

OpenAI 的首批开源 GPT 模型&#xff08;200 亿和 1200 亿参数&#xff09;现已登陆 Gradient AI 平台。此次发布让开发者在构建 AI 应用时拥有更高的灵活度和更多选择&#xff0c;无论是快速原型还是大规模生产级智能体&#xff0c;都能轻松上手。新特性开源 GPT 模型&#xf…

藏在 K8s 幕后的记忆中枢(etcd)

目录1&#xff09;etcd 基本架构2&#xff09;etcd 的读写流程总览a&#xff09;一个读流程b&#xff09;一个写流程3&#xff09;k8s存储数据过程源码解读4&#xff09;watch 机制Informer 机制etcd watch机制etcd的watchableStore源码解读5&#xff09; k8s大规模集群时会存在…

腾讯云EdgeOne安全防护:快速上手,全面抵御Web攻击

为什么需要专业的安全防护&#xff1f; 在当今数字化时代&#xff0c;网站面临的安全威胁日益增多。据统计&#xff0c;2023年全球Web应用程序攻击超7千亿次&#xff0c;持续快速增长。 其中最常见的包括&#xff1a; DDoS攻击&#xff1a;通过海量请求使服务器瘫痪Web应用攻…

SpringBoot中的条件注解

文章目录前言什么是条件注解核心原理常用条件注解详解1. ConditionalOnClass和ConditionalOnMissingClass2. ConditionalOnBean和ConditionalOnMissingBean3. ConditionalOnProperty应用场景&#xff1a;多数据源配置在SpringBoot自动配置中的核心作用自动配置的工作原理经典自…

LightGBM时序预测详解:从原理到 PSO 参数优化

前言 在时间序列预测领域&#xff0c;集成学习方法一直占据重要地位。此前我们介绍了基于传统集成思想的时序预测方法&#xff08;查看前文&#xff09;&#xff0c;而梯度提升树&#xff08;GBDT&#xff09;作为集成学习的佼佼者&#xff0c;在时序预测中表现尤为突出。本文…

django生成迁移文件,执行生成到数据库

当报错时 重新拉取git&#xff0c;重新生成迁移文件&#xff0c;重新执行 1、生成迁移文件 python manage.py makemigrations 子应用2、执行建表、建字段、修改字段 python manage.py migrate 子应用3、当手动已经在数据库创建字段时&#xff0c; 用 --fake 标记迁移为 “已应用…

2025软件供应链安全技术路线未来趋势预测

软件供应链安全已从一个技术圈的议题演变为全球企业的治理焦点。近几年&#xff0c;APT渗透、恶意包植入、开发者误操作等不同类型的供应链安全事件频发&#xff0c;使得“安全的代码来源”和“可信的交付链路”成为企业数字化转型的生命线。2025年的软件供应链安全&#xff0c…

用户登录Token缓存Redis实践:提升SpringBoot应用性能

前言在现代Web应用中&#xff0c;用户认证和授权是至关重要的功能。传统的基于数据库的Token存储方式虽然简单易用&#xff0c;但在高并发场景下容易成为性能瓶颈。本文将介绍如何将SpringBoot项目中的用户Token从数据库存储迁移到Redis缓存&#xff0c;显著提升系统性能。一、…

深度解析Structured Outputs:让AI输出严格遵循JSON Schema的结构化响应

深度解析Structured Outputs&#xff1a;让AI输出严格遵循JSON Schema的结构化响应 引言 在现代应用开发中&#xff0c;JSON 是最流行的数据交换格式之一。为了提升 API 接口的健壮性和数据一致性&#xff0c;结构化输出&#xff08;Structured Outputs&#xff09;成为了大模…

关于 微服务中服务注册与发现 的详细说明,涵盖主流框架/解决方案的对比、核心功能、配置示例及总结表格

以下是关于 微服务中服务注册与发现 的详细说明&#xff0c;涵盖主流框架/解决方案的对比、核心功能、配置示例及总结表格&#xff1a;1. 服务注册与发现的核心概念 服务注册与发现是微服务架构的基础能力&#xff0c;主要解决以下问题&#xff1a; 服务注册&#xff1a;服务实…

08高级语言逻辑结构到汇编语言之逻辑结构转换 continue break 完结汇编按逻辑结构

目录 &#x1f4da; 1. continue 语句的原理与实现 &#x1f6e0; 1.1 continue 语句的基本概念 ⚙️ 1.2 底层原理 &#x1f4d6; 1.3 案例分析&#xff1a;跳过偶数&#xff0c;累加奇数 &#x1f680; 2. break 语句的原理与实现 &#x1f6e0; 2.1 break 语句的基本概…

AI出题人给出的Java后端面经(二十二)(日更)

链接双端链表 前一篇&#xff1a;AI出题人给出的Java后端面经&#xff08;二十一&#xff09;&#xff08;日更&#xff09; 后一篇&#xff1a;null 目录 &#x1f535; 一、Java基础&#xff08;集合/流式/OOP&#xff09; 答案&#xff1a; 题目1&#xff1a;集合遍历性…

AI赋能体育训练突破:AI动作捕捉矫正精准、战术分析系统提效率,运动员破瓶颈新路径

传统体育训练长期受限于 “动作矫正依赖教练主观判断”“战术分析滞后于赛场变化”“运动员体能分配凭经验摸索” 的难题&#xff0c;而 AI 技术的深度介入&#xff0c;正让体育训练从 “经验驱动” 转向 “数据驱动”&#xff0c;既能实时捕捉动作偏差&#xff0c;又能动态优化…

【python实用小脚本-194】Python PNR一键查票:输入号码秒出座位状态——再也不用刷12306

Python PNR一键查票&#xff1a;输入号码秒出座位状态——再也不用刷12306 PNR查询, 实时座位, 离线脚本, 零广告, 瑞士军刀 故事开场&#xff1a;一把瑞士军刀救了赶火车的你 周五傍晚&#xff0c;你拎着行李冲向站台&#xff0c;手机信号一格&#xff0c;12306 死活刷不出座位…

【python】python进阶——推导式

目录 一、推导式介绍 二、推导式的用法 2.1 列表推导式 2.2 字典推导式 2.3 集合推导式 2.4 生成器表达式 三、推导式的嵌套和复杂用法 3.1 嵌套推导式 3.2 多重条件推导式 四、推导式对比传统循环 4.1 性能比较 4.2 可读性比较 五、常见应用场景 5.1 数据清…

数字安全隐形基石:随机数、熵源与DRBG核心解析与技术关联

前言&#xff1a;数字安全的 “隐形基石” 在数字化浪潮席卷全球的今天&#xff0c;从金融交易的密钥生成到区块链的共识机制&#xff0c;从量子通信的加密协议到智能汽车的身份认证&#xff0c;随机数如同空气般渗透在信息系统的每一个安全节点。然而&#xff0c;看似简单的 …

TDengine IDMP 最佳实践

最佳实践 IDMP 提供了一强大的数据建模能力&#xff0c;让数据标准化、情景化&#xff0c;从而可以更好地利用 AI 技术&#xff0c;从数据中挖掘出业务价值&#xff0c;但数据建模本身是一个很难用 AI 完成的事情。 为最大程度减少建模的成本&#xff0c;TDengine 推荐在数据…

8.20网络编程——sqlite3数据库

文章目录一、思维导图二、学生管理系统1、myhead.h2、代码三、牛客网刷题一、思维导图 二、学生管理系统 1、myhead.h #ifndef __MYHEAD_H__ #define __MYHEAD_H__#include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h>#d…

电脑不能访问服务器磁盘,连不上服务器。解决办法:在窗口中输入 regedit 确定即可打开注册表,。。。。0改为1,确认;

打开注册表&#xff1a; 按键盘上的 WinR 键&#xff0c;打开运行窗口&#xff0c;在窗口中输入 regedit 确定即可打开注册表。&#xff08;或者直接在左下角搜索框中搜索“注册表”&#xff09; 依次打开以下目录 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service…