当前位置: 首页 > news >正文

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

目录

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

一、数据与数据元素

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

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

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

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

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

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

三、数据结构的定义

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

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

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

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

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

数组下标012
数据元素ABC

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

在这里插入图片描述

(一)逻辑结构

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

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

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

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

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

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

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

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

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

1、顺序存储结构

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

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

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

2、链式存储结构

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

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

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

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

3、索引存储结构

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

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

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

4、散列存储结构

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

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

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

(三)数据的运算

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

相关文章:

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

目录 一、数据与数据元素二、数据类型和抽象数据类型三、数据结构的定义&#xff08;一&#xff09;逻辑结构&#xff08;二&#xff09;存储结构&#xff08;物理结构&#xff09;1、顺序存储结构2、链式存储结构3、索引存储结构4、散列存储结构 &#xff08;三&#xff09;数…...

关于 打开虚拟机出现“...由VMware产品创建,但该产品与此版VMwareWorkstateion不兼容,因此无法使用” 的解决方法

文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133678951 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…...

windows的最佳选项卡式窗口管理器软件TidyTabs

下载&#xff1a; https://jmj.cc/s/z1t3kt?pucodeS1wc https://download.csdn.net/download/mo3408/88420433 TidyTabs是一款Windows应用程序&#xff0c;它可以将多个打开的窗口整理成一个选项卡式的界面&#xff0c;使得用户可以更加方便地切换和管理不同的窗口。 Tidy…...

【Python 千题 —— 基础篇】浮点数转为整数

题目描述 题目描述 给出一个浮点数&#xff0c;请将这个浮点数转换成整数。 输入描述 输入一个浮点数。 输出描述 程序将浮点数转换为整数并输出。 示例 示例 ① 2.333输出&#xff1a; 2代码讲解 下面是本题的代码&#xff1a; # 描述: 给出一个浮点数&#xff0c…...

【Linux--进程间通信】

进程间通信介绍 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息。通知它&#xff08;它们&#xff09;发生了某种事件&#xff08;如…...

Linux C文件操作

文章目录 文件操作函数文件系统调用系统调用与标准函数c的调用的区别文件的读取位置标准c函数系统调用空洞文件 文件的内存映射操作文件目录 linux下的文件操作包括两种&#xff0c;一种是使用C函数&#xff0c;一种是使用系统调用。 gcc 常用来实现c程序的编译gcc filename.c …...

基于Cucumber的行为驱动开发(BDD)实例

本篇介绍 Cucumber 的基本使用&#xff0c; 因为Cucumber是BDD的工具&#xff0c; 所以首先需要弄清楚什么是BDD&#xff0c;而在介绍BDD之前&#xff0c;先看看常见的软件开发方法。 常见的软件开发方法 面向过程开发&#xff08;Procedural Development&#xff09;&#x…...

十六、代码校验(2)

本章概要 前置条件 断言&#xff08;Assertions&#xff09;Java 断言语法Guava 断言使用断言进行契约式设计检查指令前置条件后置条件不变性放松 DbC 检查或非常严格的 DbCDbC 单元测试 前置条件 前置条件的概念来自于契约式设计(Design By Contract, DbC), 利用断言机制…...

安卓 kotlin-supportFragmentManager报红

如果你继承baseActivity 请查看 是不是继承 AppCompatActivity...

linux中安装RocketMQ以及dashboard

前提&#xff1a; 需要安装jdk8 上传下面的文件到服务器中 新建目录 mkdir rocketmq 将下载后的压缩包上传到阿里云服务器或者虚拟机中去&#xff0c;并解压 unzip rocketmq-all-4.9.2-bin-release.zip 配置环境变量 vim /etc/profile 配置内容&#xff1a; export NAM…...

Android kotlin内联函数(inline)的详解与原理

一、介绍 在kotlin中&#xff0c;有一种函数叫内联函数&#xff0c;这种函数标识符是inline&#xff0c;但是好多人对这个函数的理解只停留在八股文中&#xff0c;内容函数的用法和普通函数没有区别&#xff0c;但是在编译原理上是有&#xff0c;对程序的性能有一定的影响。 二…...

林沛满---一个面试建议

在应聘一个技术职位之前&#xff0c;做好充分的准备无疑能大大提高成功率。这里所说的准备并不是指押题&#xff0c;因为有经验的面试官往往准备了海量的题库&#xff0c;押中的概率太低。比如我有位同事的题库里有上百道题&#xff0c;内容涵盖了编程、操作系统、网络、存储……...

CMake教程-第 5 步:安装和测试

CMake教程-第 5 步&#xff1a;安装和测试 1 CMake教程介绍2 学习步骤Step 1: A Basic Starting PointStep 2: Adding a LibraryStep 3: Adding Usage Requirements for a LibraryStep 4: Adding Generator ExpressionsStep 5: Installing and TestingStep 6: Adding Support f…...

移动应用-Android开发基础\核心知识点

Android开发基础 知识点 1 介绍了解2 系统体系架构3 四大应用组件4 移动操作系统优缺点5 开发工具6 配置工具7 下载相关资源8JDK下载安装流程9配置好SDK和JDK环境10 第一个Hello word11 AS开发前常用设置12模拟器使用运行13 真机调试14 AndroidUI基础布局15 加载展示XML布局16…...

Java读取并转换字符串中的浮点数

在写Android接收蓝牙数据的时候&#xff0c;由于传过来的蓝牙数据转换后都为字符串格式&#xff0c;但是需要从其中提取出来浮点数&#xff0c;所以通过查阅资料写出了从字符串中提取并转换为浮点数的方法&#xff0c;特记录下来以供参考。 目录 原始数据内容 提取字符串中的…...

SQL: 索引原理与创建索引的规范

SQL 索引是一种数据结构&#xff0c;用于加速数据库查询操作。它通过在表的列上创建索引&#xff0c;提供了一种快速查找数据的方法&#xff0c;减少了数据库的扫描和比较操作&#xff0c;从而提高了查询性能。索引根据其实现方式可以分为多种类型&#xff0c;如 B-树索引、哈希…...

基于STM32_DS18B20单总线传感器驱动

基于STM32_DS18B20单总线传感器驱动 文章目录 基于STM32_DS18B20单总线传感器驱动前言一、BS18B20&#xff1f;二、原理1.复位与检验2.基本命令3.唯一ROM识别码4.温度转换 三、驱动代码四、注意事项 前言 本文以一款典型的单总线传感器及其驱动——DS18B20为例&#xff0c;简单…...

目标识别项目实战:基于Yolov7-LPRNet的动态车牌目标识别算法模型(三)

前言 目标识别如今以及迭代了这么多年&#xff0c;普遍受大家认可和欢迎的目标识别框架就是YOLO了。按照官方描述&#xff0c;YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性…...

springboot线程池创建与使用

/*** author: zcs* Title: TaskPoolConfig* Description: 线程池配置* date: 2023/10/11 17:52*/ Component public class TaskPoolConfig {Bean(name "threadPoolTaskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor taskExecutor new ThreadP…...

UDP和TCP特点(部分)对比:

传输层的两个主要协议&#xff1a;TCP 和 UDP UDP和TCP特点&#xff08;部分&#xff09;对比&#xff1a; UDP&#xff1a;无连接&#xff0c; 不可靠传输&#xff0c; 面向数据报&#xff0c; 全双工。 TCP&#xff1a;有连接&#xff0c; 可靠传输&#xff0c; 面向字节流…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...