数据结构学习笔记——数据结构概论

news2024/11/18 4:35:09

目录

  • 一、数据与数据元素
  • 二、数据类型和抽象数据类型
  • 三、数据结构的定义
    • (一)逻辑结构
    • (二)存储结构(物理结构)
      • 1、顺序存储结构
      • 2、链式存储结构
      • 3、索引存储结构
      • 4、散列存储结构
    • (三)数据的运算

一、数据与数据元素

数据是客观事物的符号表示,可以说是信息的载体,它是所有能被输入到计算机中,并被计算机程序识别和处理的符号集合。

数据由数据元素组成,即数据元素是数据的基本单位,而数据元素又由若干个数据项组成,所以,数据项是组成数据元素的最基本、不可分割的最小单位

数据
数据元素
数据项
...
数据对象

另外,具有相同性质的数据元素集合称为数据对象,它是数据的一个子集

二、数据类型和抽象数据类型

数据类型是高级程序语言中的一个基本概念,它是一个值的集合和定义在集合上一组操作的总称。抽象数据类型是指由用户定义,即用数学化的语言来定义数据的逻辑结构、运算等等,从而表示的数学模型,它包括三个部分,数据对象数据对象上关系的集合对数据对象的基本操作的集合

三、数据结构的定义

探究一种数据结构的方法分为三个步骤:
1、首先,要定义数据元素之间的关系,即定义逻辑上的结构;
2、由于需要存储这些数据元素,所以需要确定某种存储结构,实现数据结构以及对数据结构的基本运算,即定义存储结构;
3、针对实现的需求,需要对这种逻辑结构进行怎样的运算,即数据的运算。

例如,举一个现实中的例子,公司员工的信息表,其中每个员工的信息就是一个数据元素;由于每个员工都有员工编号,所以其编号的前后员工也是存在的,即有前驱和后驱(线性结构),另外,公司中还存在一个经理来领导某一个部门的所有员工(非线性结构),从而对应逻辑结构;这些信息都某种存储方式被存储在计算机中,其中存储的方式有很多,即对应存储结构;当公司有新的员工入职(增加)、老员工离职(删除)、员工信息修改(修改)、查找某个员工的信息(查找)等情况,即对应数据的运算。

数据结构针对数据元素的集合,指这些数据元素中存在一种或多种特定关系的数据元素的集合,它包括逻辑结构、存储结构和数据的运算共三个方面,即数据结构的三个方面缺一不可,另外,存储结构也可称为物理结构,如下:

数据元素
逻辑结构
存储结构
数据的运算

例如,一维数组中存在一对一的关系,它存储一组具有相同数据类型的数据元素,通过数组下标来访问,每个数据元素在一维数组中都对应有一个特定的位置,如下:

数组下标012
数据元素ABC

二叉树是一对二,即一对多的关系,其中每个结点可以算作一个根结点,每个根结点的后继结点最多只能有两个,从而对应左子树(左孩子)和右子树(右孩子),而没有后继结点的则称为叶子结点,如下图:

在这里插入图片描述

(一)逻辑结构

逻辑结构指的是数据元素之间在逻辑上的关系,可分为线性结构非线性结构,如下:

逻辑结构
线性结构
一对一
非线性结构
一对多
多对多

例如,顺序表、单链表、哈希表既描述逻辑结构,又描述存储结构和数据的运算,而有序表只是一种逻辑结构,它只表示数据元素之间的逻辑关系是有序的。

1、线性结构是一对一的关系,例如有线性表、栈、队列、串、一维数组等。
2、非线性结构是一对多多对多的关系,例如有二维数组(多维数组)、广义表、树(二叉树)、图等。

通常指的线性结构即数据元素之间存在一对一的关系,树形结构(树、二叉树等)即数据元素之间存在一对多的关系,图形结构(无向图、有向图等)即数据元素之间存在多对多的关系,而集合中的数据元素之间无关系。

(二)存储结构(物理结构)

数据的逻辑结构在计算机中的表示称为存储结构,也称为物理结构,根据其存储特点可以分为四种存储结构,即顺序存储结构、链式存储结构、索引存储结构和散列存储结构。

存储结构
顺序存储结构
链式存储结构
索引存储结构
散列存储结构

以上四种存储结构,由于每种存储结构都有其优缺点,不能直接地说哪种存储结构最优,只能说在针对某种数据结构中需要选择不同的存储结构时,应该选择符合其特点的数据结构才是最优的。

1、顺序存储结构

顺序存储由存储单元的邻接关系体现,即把逻辑上相邻的元素存储在物理位置上也相邻的存储单元里,其中数据是连续的。

  • 该存储结构的优点是可以实现随机存取,每个元素占用最少的存储空间,而缺点是由于只能使用相邻的一整块存储单元,从而会产生较多的外部碎片

以线性表为例,通过顺序存储的线性表称为顺序表,它是将线性表中所有元素按照其逻辑顺序,依次存储到指定存储位置开始的一块连续的存储空间里;而通过链式存储的链表中,每个结点不仅包含该元素的信息,还包含元素之间的逻辑关系的信息。

2、链式存储结构

链式存储不要求逻辑上相邻的元素物理位置上也相邻,通过指示元素存储地址的指针来体现元素之间的逻辑关系,其数据是可离散的。

  • 该存储结构的优点充分利用了所有的存储单元,不会造成碎片现象,而缺点是由于通过指针来表示逻辑关系,所以指针也要存储,从而占用额外的存储空间,即链式存储的存储结构所占存储空间分两部分,一部分存放结点的值,另一部分存放表示结点间关系的指针(结点内的存储单元要求连续,而不同结点的存储空间可以不连续),例如,顺序表的存储密度=1,而链表的存储密度<1,是由于结点中含有指针域。另外,链式结构只能顺序存取,不能随机存储。

以线性表为例,单链表是通过链式存储的,其每个结点除了存放数据元素之外,还存储指向下一个结点的指针;而顺序表是顺序存储的,其每个结点只存放数据元素。顺序存储结构可以随机存取、顺序存取,而链式存储结构只能顺序存取,顺序存储结构不仅可用于存储线性结构,还能用于树、图等非线性结构。

针对线性表,以上两种存储结构在线性表中的实际选择:
在一般情况下,若需对表进行频繁的插入、删除操作,此时适合选链式存储,因为顺序表平均需要移动近一半的元素且耗费时间(其插入和删除算法的平均时间复杂度为O(n)),而链表在插入和删除操作时不需要移动元素,只需修改指针;当若表的总数基本稳定,且很少进行插入和删除操作,则顺序表相较于链表可以充分发挥其存取速度块、存储利用率高的优点。

3、索引存储结构

索引存储在存储数据元素的同时还需要建立附加的索引表,其中的索引项的形式为关键字和地址,其数据是可离散的。

  • 该存储结构的优点是在查找数据元素时很快、容易找到,而缺点是由于附加了索引表,从而占用了额外的存储空间,同时,若需要增加和修改数据时,需修改索引表,会花费较多时间。

例如,查找算法中树型查找的B树、B+树的应用到了索引存储结构。

4、散列存储结构

散列存储是根据数据元素的关键字直接计算其存储地址,也称为哈希存储(Hash),其数据是可离散的。

  • 该存储结构的优点是在对数据元素进行增加、删除结点操作时很快,而缺点是若定义的哈希函数不能完全贴合情况,则会发生元素存储单元的冲突,而减少冲突从而会花费时间和一定的空间上的开销。

例如,哈希表即为一种基于散列存储结构的查找表。

(三)数据的运算

前面说过,针对实现的需求,需要对这种逻辑结构进行怎样的运算,即数据的运算,它是数据定义的一组操作,而运算的实现是通过存储结构的。【定义针对逻辑结构、实现针对存储结构
例如,顺序表的增删改查,即为数据的运算,对应的是顺序表插入操作、删除操作、修改元素和查找元素。

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

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

相关文章

Python 自定义包和模块随机生成6位验证码(详解版)

一、新建一个包&#xff08;两种方法&#xff09; 方法一&#xff1a;先新建一个空目录命名为"小功能包"&#xff0c;然后在新建的目录下新建一个空__init__.py&#xff08;目的是声明当前目录是一个包&#xff09; 方法二&#xff1a;直接在PyCharm用鼠标依次点击F…

【Unity】【VR】如何让Distance Grab抓取物品时限制物品的Rotation

【背景】 遇到这样的场景,希望抓取Canvas时,Canvas不会沿Z轴旋转。 【问题】 发现Freeze Canvas的Rigid Body没有用。 【分析】 应该是RigidBody的限制仅在物理互动下生效,抓取可能不属于物理互动(比如碰撞),所以不生效。 【思路】 还是得写脚本挂载在Interacta…

LeetCode 69.x的平方

LeetCode 69.x的平方 思路&#xff1a; 二分查找。从1到x进行二分查找&#xff0c;每次判断mid的平方是否<x&#xff0c; 如果是&#xff0c;则更新ansmid&#xff0c;并缩小区间&#xff1b; 如果不是&#xff0c;则缩小区间&#xff1b; 最后则找到最接近的ans&#xff0…

数字IC/FPGA面试题目合集解析(一)

数字IC/FPGA面试题目合集解析&#xff08;一&#xff09; 题目概述题目1&#xff0c;计算题2&#xff0c;计算题3&#xff0c;选择题 答案与解析1&#xff0c;计算题2&#xff0c;计算题3&#xff0c;选择题 题目概述 1&#xff0c;计算题&#xff1a;计算该触发器等效的建立保…

AI项目十五:PP-Humanseg训练及onnxruntime部署

若该文为原创文章&#xff0c;转载请注明原文出处。 关于PP-Humanseg是在正点原子的3568开发板AI测试例子里看到的&#xff0c;目的也是想自己训练并部署&#xff0c;这里记录一下训练和在onnxruntime部署运行的全过程&#xff0c;会转成ONNX&#xff0c;至于部署到rk3568上&a…

Leetcode刷题详解——移动零

题目链接&#xff1a;移动零 题目描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出…

深度学习自学笔记十三:unet网络详解和环境配置

一、unet网络详解 UNet&#xff08;全名为 U-Net&#xff09;是一种深度学习架构&#xff0c;最初由Olaf Ronneberger、Philipp Fischer和Thomas Brox于2015年提出&#xff0c;用于图像分割任务。该网络的名称来源于其U形状的架构&#xff0c;该架构使得网络在编码和解码过程中…

Linux查看本机IP地址

Linux查看本机IP地址 命令 ipconfig可能会遇到的问题 Command ‘ifconfig’ not found, but can be installed with: Command ifconfig not found, but can be installed with:sudo apt install net-tools解决办法 安装net-tools再执行ipconfig 安装网络工具 sudo apt i…

Java-集合框架

文章目录 摘要CollectionCollection集合遍历Iterator迭代器增强for循环 排序 ListArrayListLinkedListVector SetHashSet Map小结 摘要 Java的集合框架提供了一组用于存储、管理和操作数据的类和接口。这个框架提供了各种数据结构&#xff0c;如列表、集合、队列和映射&#x…

sqoop 脚本密码管理

1&#xff1a;背景 生产上很多sqoop脚本的密码都是铭文&#xff0c;很不安全&#xff0c;找了一些帖子&#xff0c;自己尝试了下&#xff0c;记录下细节&#xff0c;使用的方式是将密码存在hdfs上然后在脚本里用别名来替代。 2&#xff1a;正文 第一步&#xff1a;创建密码对…

分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输…

小迈物联网网关对接串口服务器[Modbus RTU]

很多工控现场&#xff0c;方案中会使用串口服务器采集Modbus RTU的设备&#xff0c;这种情况下一般会在PC机上装上串口服务器厂家的软件来进行数据采集。如果现场不需要PC机&#xff0c;而是通过网关将数据传输到软件平台&#xff0c;如何实现呢&#xff1f; 本文简要介绍小迈网…

记录用命令行将项目打包成war包

记录用命令行将项目打包成war包 找到项目的pom.xml 在当前路径下进入cmd 输入命令 mvn clean package 发现报错了 Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project MMS: Error assembling WAR: webxml attribute is req…

编程助手成为编程高手,帮您正则调试

官方下载地址&#xff1a;安果移动 视频演示地址&#xff1a;编程助手-正则调试与面试题&#xff0c;升职加薪不是梦_哔哩哔哩_bilibili 编程助手成为编程高手&#xff0c;帮您正则调试 软件介绍版本号 1.0.2更新日期 2023-10-11 找工作不敢谈薪资&#xff1f;总觉得公司欠我…

【JVM】初步认识Java虚拟机

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 JVM 一、初识JVM1.1 什么是JVM1.2 JVM的功能…

C之fopen/fclose/fread/fwrite/flseek

一、C中文件操作简介 c中的文件操作大致和linux的文件操作类似&#xff0c;但是毕竟是不同的API&#xff0c;所以会有些差异。部分差异会在下面的案例中体验 二、fopen open的参数有两个一个是文件名&#xff0c;一个是模式选择&#xff0c;不同open函数&#xff0c;open中的模…

python - 第15章 GUI的最终选择 Tkinter

文章目录 tk1tk2tk3 添加图片tk4 图片作背景 tk1 import tkinter as tkapptk.Tk() app.title("这是标题") # 显示标题theLabeltk.Label(app,text窗口程序!) # 显示文本,图片,图标 theLabel.pack() # 自动调节组件尺寸app.mainloop()tk2 import tkinter as tkclas…

各省份12.5m地形数据

手机整理了全国各省份12.5m的地形数据&#xff0c;ALOS的。 另外也有全国30m的地形数据&#xff0c;可以去我的博客目录找&#xff0c;以及各种模型数据均可在下面链接下载。 传送门&#xff1a;数据共享中心

017-第三代软件开发环境搭建

第三代软件开发环境搭建 文章目录 第三代软件开发环境搭建项目介绍实体机安装Ubuntu系统安装Qt安装GCC & G安装 OPen GL安装Git配置用户名和邮箱生成 SSH 安装VS Code安装Chrome安装搜狗输入法安装字体查看字体拷贝字体到目标机拷贝字体到目标机字体目录安装字体重启设备 安…

Unity基础课程之物理引擎2-碰撞检测案例-吃金币并加分

业务逻辑&#x1f4bc;&#xff1a; 这个脚本的主要功能是让主角在场景中吃到金币&#x1f4b0;&#xff0c;每吃到一个金币&#xff0c;主角的分数就会增加 10 分&#x1f389;&#xff0c;同时销毁金币。这样&#xff0c;玩家就可以通过吃金币来增加分数&#xff0c;挑战更高…