一文了解数据结构

news2024/11/18 21:27:57

目录

数据结构

什么是数据结构

链表

数组

队列

哈希表


数据结构

什么是数据结构

「数据结构」决定了数据的顺序和位置关系.数据存储于内存时,决定了数据顺序和位置关系的便是数据结构

链表

「链表」中的数据呈线性排列。链表中添加删除数据比较方便,访问数据只能从第一个数据开始,顺着指针指向一一往下访问顺序访问

「双向链表」把数据的指针设定为两个,让它们分别指向前后数据。缺点:指针数的增加会导致存储空间需求增加;二是添加和删除数据时需要改变更多指针的指向。

「循环链表」在链表尾部使用指针,并且让它指向链表头部的数据,将链表变成环形。这就是"循环链表",也称为"环形链表"。使用这种链表,不仅可以从前往后,还可以从后往前遍历数据,十分方便。

「内存分布」数据一般都是分散存储于内存中的,无须存储在连续的空间内。

「添加&删除元素」改变添加位置前后的指针指向就可以。删除元素改变删除元素前一个元素的指针指向即可。删除的元素本身还存在于内存中,但是无法访问到这个数据,所以没有删除它的必要。下次需要用到删除元素所在的存储空间时,只需要用新数据覆盖掉就可以了。

「运行时间」把链表中的数据量记成 n。访问数据时,我们需要从链表头部开始查找(线性查找),如果目标数据在链表最后位置的话,需要的时间是O(n)。
    添加数据只需要改变两个指针的指向,所以耗费的时间与 n 无关。如果已经达到了添加数据的位置,那么添加操作只需花费*O(1)*的时间,删除数据亦是如此。

数组

「数组」中的数据呈线性排列,访问数据十分简单,添加删除数据比较麻烦。

「内存分布」数据是存储在连续空间内的,所以每个数据的内存地址可以通过数组下标算出,我们也就可以借此直接访问目标数据,称为「随机访问」

「添加&删除元素」首先需要在数组的末尾确保需要增加的存储空间,为了给新数据腾出位置,需要把已有的数据一个一个移开。最后在空出来的位置上写入 Green,添加数据的操作就完成了。反过来,如果要删除数据,需要把删除的元素后面的数据一个个往空位移,最后再删除多余的空间。

「运行时间」假设数组中有 n 个数据,由于访问数据时使用的是随机访问(通过下标可以计算出内存地址),所以需要的运行时间仅为恒定的O(1)

「栈」中的数据呈线性排列,在这种数据结构中,我们只能访问最新添加的数据。

「内存分布」数据是存储在连续空间内的,具有后进先出的特点。

「添加&删除元素」往栈中添加数据的操作叫作"入栈"(push),从栈中取出数据的操作叫作"出栈"(pop)。操作只能在一端进行,访问数据只能访问到顶端的数据,访问中间的数据的话,需要通过出栈操作将目标数据移到栈顶。

队列

「队列」中的数据呈线性排列。在队列中,添加和删除数据的操作分别是在两端进行的。队列具有"先进先出的特点"。

「添加&删除元素」往队列中添加数据的操作叫作"入队"。从队列中删除数据的操作叫做"出队"。从队列中取出(删除)数据时,是从最下面也就是最早入队的数据开始的。队列不能直接访问位于中间的数据,必须通过出队操作将目标数据变成首位后才能访问。

哈希表

「哈希表」可以使数据的查询效率得到显著提升。哈希表存储的是由键(Key)和值(value)组成的数据。一般来说,可以把键当成数据的标识符,把值当成数据的内容。

存储数据,尝试把 Joe 存进长度为 5 的数组,使用哈希函数(Hash)计算 Joe 的键,也就是字符串"Joe"的哈希值,得到结果为 4928。将得到的哈希值除以数组的长度 5,求得其余数。这样的运算叫做mod 运算,此处的 mod 运算结果为 3。因此,将 Joe 的数据存进数组的 3 号箱子中。如果 mod 运算后,仍有数据需要存放在 3 号箱子中(哈希冲突),可使用链表在已有数据的后面继续存储新的数据。这种方法称为"链地址法"

「解决哈希冲突的方法」
     如果数组空间太小,使用哈希表的时候就很容易发生冲突,线性查找的使用频率也会更高。如果数组空间太大,就会出现很多空箱子,造成内存的浪费。因此,给数组设定合适的空间很重要。
    开放地址法:当有冲突发生时,立即算出一个候补地址(数组上的位置)并将数据存进去。如果仍有冲突。继续计算下一个候补地址知道有空地址为止。

「堆」是一种图的树形结构,被用于实现"优先队列"。优先队列是一种数据结构,可以自由添加数据,但取出数据时候要从最小值开始按顺序取出。在堆的树型结构中,各个顶点被称为"结点"(node),数据就存储在这些结点中。「存储数据」子结点必须大于父结点。最小值被存储在顶端的根结点中。往堆中添加数据时,一般会把新数据放在最下面一行靠左的位置。当最下面一行里没有多余的空间时,就再往下另起一行,把数据加在这一行的最左端。例如添加数字5。如果子结点的数小于父结点,则交换位置。

「取出数据」取出堆中最上面的数据,因此堆的结构需要调整。将最后的数据6移动到最顶端。如果子结点的数字小于父结点的,就将父结点与其左右两个子节点中较小的一个进行交换。此时父节点6大于右边的5且大于子节点中的3,所以将左边的子节点中的3与父结点进行交换。重复这个操作直到数据都符合规则。这样,从堆中取出数据的操作便完成了。

「时间复杂度」取出最顶端的数据始终最小,时间复杂度为O(1)。取出数据后需要将最后的数据移到最顶端,然后一边比较它与子结点数据的大小,一边往下移动,所以取出数据需要的运行时间和树的高度成正比。假设数据量为n,根据堆的形状特点可知树的高度为log2n,那么重构树的时间复杂度便为O(logn)

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

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

相关文章

多旋翼无人机仿真 rotors_simulator:基于PID控制器的位置控制---水平位置控制

多旋翼无人机仿真 rotors_simulator:基于PID控制器的位置控制---水平位置控制前言水平位置控制串级P控制收敛结果收敛过程串级PID控制收敛结果收敛过程结果总结前言 无人机(Unmanned Aerial Vehicle),指的是一种由动力驱动的、无…

机器学习从零到入门 GBDT 梯度提升决策树

GBDT 梯度提升决策树详解一、 梯度的概念1、日常生活中的梯度2、函数中的梯度2.1、走进数学2.2、从数学到机器学习(1)、损失函数的理解 loss function(2)、梯度的理解 gradient(3)、损失函数的梯度下降二、GBDT1、回归树 - Regression Decision Tree,DT2、梯度提升 …

利用Python实现mysql数据库的基础操作

一:环境准备: 1.安装第三方库:pymsql 在pycharm的terminal中执行命令:pip3 install pymsql 2.导入第三方库到py文件中 import pymsql 二:创建mysql数据库的链接对象: 1.封装一个Python类,在该…

Python爬虫入狱小技巧

呀,来坐牢的是吧,坐牢是不可能坐牢的,骚年,下面就是方法,早上学,晚上进去 一、整体思路 爬虫一开始要把思路理清楚,即从网页源代码或者网页数据接口,获取需要的数据.大致思路如下 …

【Java进阶】JUC并发基础

文章目录1.概念1.1 什么是JUC1.2 线程与进程1.3 线程的几种状态1.4 守护线程1.5 死锁与活锁1.6 乐观锁与悲观锁1.7 自旋锁2.Lock2.1 使用Lock2.2 Lock与Synchronized2.3 虚假唤醒3.八锁问题3.1 创建一个Phone实例多线程调用两个方法3.2 创建一个Phone实例多线程调用两个方法&am…

基于热传导矩阵(HCM)边缘检测方法在红外图像中的应用(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…

3道真题训练|学会链表的前世今生

🙋很多朋友都问我学完基础知识以后怎样提高编程水平?当然是刷题啦!很多小伙伴都在纠结从哪里开始,今天给大家推荐一个身边朋友都在使用的刷题网站:点击进入牛客网刷题吧! 🙋‍♂️今天是Java …

中文文本分类,基本模型的pytoch实现

学习说明:最近发现了一个宝藏仓库,将常见的文本分类方法做了一个介绍、及封装。现在将学习这仓库的一些笔记记录如下 参照资料 649453932/Chinese-Text-Classification-Pytorch: 中文文本分类,TextCNN,TextRNN,FastT…

宣布 .NET MAUI 支持 .NET 7 Release Candidate 2

支持 .NET 7 Release Candidate 2的 .NET 多平台应用程序 UI (MAUI) 现在可在 Windows 和 Mac 上的 Visual Studio 17.4 Preview 4 中使用。RC2 的主要主题是质量和对带有 iOS 16 的 Xcode 14 的 .NET 支持。此版本包含在生产中使用的上线支持许可证。 在相关新闻中&#xff0…

Linux 内存node和zone

文章目录前言一、内存模型二、(N)UMA2.1 简介2.2 节点2.3 UMA节点与Flat Memory Model2.4 zone2.4.1 zone2.4.2 zone_type参考资料前言 一、内存模型 所谓memory model,其实就是从cpu的角度看,其物理内存的分布情况,…

图解操作系统-cpu cache

不同物理器件的访问速度不一:速度快的代价高、容量小;代价低且容量大,速度较慢。 为充分发挥各种器件优点,计算机存储数据的物理器件不会只选择一种,而是以CPU为核心,由内而外地组建一整套存储体系结构。它…

亿可控_第2章_指标数据采集与断连监控

亿可控_第2章_指标数据采集与断连监控 文章目录亿可控_第2章_指标数据采集与断连监控第2章 指标数据采集与断连监控学习目标1. EMQ指标主题订阅1.1 Eclipse paho简介1.2 发送与订阅消息1.2.1 发送消息1.2.2 订阅消息1.3 订阅指标主题1.3.1 需求分析1.3.2 实现思路1.3.3 代码实现…

23模式---单例模式

单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例) 这个也是23设计模型中最…

Python 图像处理OpenCV:几何变换(笔记)

包括图像缩放、图像平移、图像旋转、图像的仿射变换、图像的透射变换及图像金字塔等内容。 图像缩放: 缩放是对图像的大小进行调整,即使图像放大或缩小。cv2.resize(src,dsize,fx0,fy0,interpolationcv2.INTER_LINEAR)src : 输入图像dsize: 绝对尺寸&a…

Linux运维面试题总结—Linux基础、计算机网络基础

文章目录一、三次握手四次挥手二、如何划分vlan三、为什么划分vlanvlan三个模式:vxlan和vlan区别是什么?四、OSI七层模型及对应协议五、Linux中 查找大于10M的文件并删除六、查看cup占用情况,查看内存,查看磁盘IO使用情况&#xf…

图像处理黑科技——弯曲矫正、去摩尔纹、切边增强、PS检测

目录0 前言1 弯曲矫正2 去摩尔纹3 图像切边增强4 PS检测5 总结0 前言 合合信息是行业领先的人工智能及大数据科技企业,专注文字识别领域16年,在智能文字识别及商业大数据等核心领域处于国内领先地位,全球企业和个人用户提供创新的数字化、智…

代码随想录动态规划——一和零

题目 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 示例 1: 输入:strs [“10…

Oracle Unifier 系统架构简述(安装部署)

关于Oracle Primavera Unifier 的应用架构,其实在我之前的博客已有介绍相关内容 谈谈 Oracle P6 , Unifier 和其他应用系统间的联系https://campin.blog.csdn.net/article/details/104972949 从官方文档方面,其实在《unifier_performance_and_sizing_g…

【C语言】全面解析数据在内存中的存储

文章目录前言类型的基本分类整型浮点数自定义类型整型在内存中的存储原码、反码、补码大端和小端如何判断编译器是大端还是小端浮点数在内存中的存储总结前言 C语言中有char、short、int、long、long long、float和doubole这些数据类型。这些数据类型也叫内置类型。 所占存储空…

JECloud微服务低代码平台重大发布。

JECloud微服务低代码平台【1.0.0】版升级发布,本次发布内容如下: JECloud微服务低代码平台是一款基于元数据领域模型构建的低代码开发平台,其底层采用微服务与微应用构建底层框架,并基于基础框架构建各核心微服务模块来实现低代码…