数据结构(每周更新版)

简介: 数据结构(每周更新版)


前言

数据结构,顾名思义,就是每种数据的存储结构
我们要研究的是: 数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据与修改数据


一、数据结构的分类

数据结构主要分成三类

线性结构:
数组, 队列, 栈, 链表, 哈希表...
树型结构:
二叉树, 二分搜索树, AVL树, 红黑树, 堆, Trie, 线段树,
图结构:
邻接矩阵, 邻接表, 排序算法

二、线性结构

1.数组

数组特点:

  1. 存储相同的类型
  2. 内存空间是连续的, 创建时指定大小
  3. 创建方式指定大小: int[] arr = new int[10]
    字面量赋值: int[] arr = {1,2,3,4,5}
  4. 索引位置0~length-1
  5. 异常:NullPointException,ArrayIndexOutofBoundsException

数组的使用:
通过使用索引对数组查询
优点:快速查询;
缺点:在中间插入数据时, 插入点以及之后的数据均会后移, 与在尾部插入数据效率差距大

2.复杂度分析

时间复杂度分析
通常用O(1),O(n),O(lgn),O(nlgn),O(n*n)
O(n): 算法运行时间和输入输出之间的关系
具体详解:请点击此处
==在获取算法的时间复杂度时候, 通常是忽略常数的 ==
而且分析时间复杂度时候,一般都是n趋于无穷

例如
T=2*n+2 时间复杂度就是 O(n)

T=2000*n+100000 时间复杂度就是 O(n)
T=1 nn+0 时间复杂度就是 O(n*n)

分析数组添加元素的时间复杂度:

在尾部添加元素: O(1)
在头部添加:O(n)
在任意位置添加元素: 最好情况是不移动,最坏情况O(n),平均下来就是O(n/2)--->O(n)

在更改数组元素时, 已知索引是O(1),不知道索引就O(n)

在查询数组元素时, 已知索引是O(1),不知道索引就O(n)

综合来说数组添加元素的时间复杂度是O(n)

数组删除元素的时间复杂度类似添加元素的时间复杂度,时间复杂度也是O(n)

==注意数组扩容时候==
扩容时候,要求原数组的所有元素移动到新数组里,并且新元素添加新数组里,
可以把添加最后一个元素时候的所有操作(移动老元素),均摊到之前的添加元素步骤上面,平均下来大约是O(2)_,叫做均摊时间复杂度

三、栈和队列

栈Stack
操作时,只能从栈顶进行操作,先进入栈的元素最后出,最后进来的元素先出来,即后进先出(First Last Out)FILO
  1. 从栈中取元素叫 入栈
  2. 从栈中加元素叫 出栈
  3. 查看栈顶元素
  4. 栈中实际元素存放元素个数
  5. 查看栈是否为空
  6. 遍历栈

示意图:
在这里插入图片描述

队列
队列特点:先进先出
  1. 入队
  2. 出队
  3. 查看队首元素
  4. 查看队列的元素总个数
  5. 判断队列是否是空

在这里插入图片描述

四、队列的复杂度问题

由于在队列中, 一个元素出队列她的复杂度总是O(n),所以要该进成复杂度是O(1)的复杂度

导致复杂度O(n)的原因:
由于队列里的队首元素移除后, 其他元素都要向前移动,所以就会造成时间的堆积, 时间复杂度就增加了
==解决: 要让队首元素移动之后,不要让其他元素移动==

图解:
在这里插入图片描述

  1. 在如图定性分析一下后, 又有新问题,那就是新元素添加的索引地址如何确定呢?

可以想到,在之前添加元素的时候的下标是移动的,这里的tail实际是数组的首地址0的位置,但是
按照添加元素的个数来说,已经添加了7个元素,已经满了,这是添加第八个元素(索引7的位置),
所以这里巧妙地给tail取模运算==tail=tail%array.length==,这样一来新的tail是0,就是添加下一个元素的地方

  1. 再想想,又有问题抛出,就是如何判断数组满呢?

==(tail%array.length=front%array,length==, 但突然又想到,当数组是空的时候, 也是满足这个表达式的,所以索性就浪费与空间来表示空间满了的情况, ==(tail+1)%array.length = front%array,length==

上代码:

循环队列底层的循环数组代码

构造方法
上代码:

获取容积
在这里插入图片描述>判断队列是否为空
在这里插入图片描述

尾部插入元素
在这里插入图片描述

队首出元素
在这里插入图片描述
查看队首元素
在这里插入图片描述

扩容操作
在这里插入图片描述

在这里插入图片描述

相关文章
|
机器学习/深度学习 人工智能 算法
详解机器学习概念、算法
详解机器学习概念、算法
详解机器学习概念、算法
|
存储 关系型数据库 MySQL
Flink CDC 中,Checkpoints
Flink CDC 中,Checkpoints
1235 1
|
7月前
|
安全 数据库 数据安全/隐私保护
Python办公自动化实战:手把手教你打造智能邮件发送工具
本文介绍如何使用Python的smtplib和email库构建智能邮件系统,支持图文混排、多附件及多收件人邮件自动发送。通过实战案例与代码详解,帮助读者快速实现办公场景中的邮件自动化需求。
629 0
|
5月前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
1420 0
|
7月前
|
JSON Shell API
查手机号归属地免费API接口教程
本接口提供手机号码归属地查询功能,支持获取号段、归属地省份/城市、运营商、区号、邮编等信息。请求地址为 `https://cn.apihz.cn/api/ip/shouji.php`,支持 POST 或 GET 方式调用,需提供 `id`、`key` 和 `phone` 参数。返回包含归属地信息及运营商等数据,适用于手机号归属查询场景。
1247 6
|
前端开发 测试技术 定位技术
如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤
本文深入介绍了如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤。通过实例展示了主页、关于我们、产品展示、新闻动态及联系我们等页面的设计与实现,强调了合理布局、美观设计及用户体验的重要性。旨在为企业打造一个既专业又具吸引力的线上平台。
564 7
|
数据采集 存储 数据管理
CDGA|如何实施非常精准的数据治理策略?
精准的数据治理需要企业从设定明确目标、制定适应性策略、构建完善组织结构、制定严谨制度流程、采用先进技术工具、加强事前预防、推动数据驱动决策以及建立健全监督与评估机制等多个方面入手。只有这样,企业才能有效应对数据时代带来的挑战,充分释放数据价值,为组织的可持续发展提供有力支撑。
|
存储 程序员 Python
Python函数定义与调用详解
Python中的函数是可重用代码块,用于接收参数、执行操作并可能返回输出。通过`def`定义函数,如`def greet(name): print(f"Hello, {name}!")`。函数可接受任意数量的参数,包括默认值。调用函数时提供参数,如`greet("Alice")`。可变参数通过星号(*)和双星号(**)实现。函数有助于代码模块化、理解和维护。掌握函数是Python编程基础。
|
Java jenkins 应用服务中间件
nginx启动、停止和重启(一)
nginx启动、停止和重启
1421 0
|
Go 网络架构 网络协议
UDP 单播、广播和多播
阅读目录(Content) 一、UDP广播  二、UDP多播 1、多播(组播)的概念 2、广域网的多播 三、UDP广播与单播 广播与单播的比较      使用UDP协议进行信息的传输之前不需要建议连接。
4457 0