数据结构的基本概念

可以想象,将一大堆杂乱无章的数据交给计算机处理是很不明智的,结果是计算机处理的效率非常低,有时甚至根本无法进行处理。于是人们开始考虑如何更有效地描述、表示、存储数据,这就是数据结构需要解决的问题。

▶1.数据结构的发展

早期计算机的主要功能是处理数值计算问题。由于当时涉及的运算对象是简单的整数(整型)、实数(浮点型数值)或布尔类型的逻辑数据,因此人们的主要精力集中于程序设计的技巧上,而无须重视数据结构。随着计算机应用领域的不断扩大,非数值计算问题越来越广泛。非数值计算问题涉及的数据类型更为复杂,数据之间的相互关系很难用数学方程式加以描述。因此,解决非数值计算问题的数学模型不再是数学分析和计算方法,而是要设计出合适的数据结构,才能有效地解决问题。
1968年,高德纳(Donald Ervin Knuth)开创了数据结构的最初体系,他所著的《计算机程序设计艺术》第一卷《基本算法》是第一本系统阐述数据结构的著作。瑞士计算机科学家尼古拉斯·沃斯(Niklaus Wirth,1984年获图灵奖)在1976年出版的著作中指出:算法+数据结构=程序,可见数据结构在程序设计中的重要性。

▶2.实际工作中的数据结构问题

对无法用数学公式描述的非数值计算问题,其数学模型集中在数据结构的建立。在解决现实中的许多非数值型问题时,数据结构发挥了非常重要的作用。
例:利用表对问题进行描述。学生基本情况表记录了一个班学生的学号、姓名等信息。表中每个学生的各项信息排在一行中,这一行称为记录,这个表就是一个数据结构。对整个表来说,每个记录就是一个节点,只有一个开始节点(它的前面无记录)和一个终端节点(它的后面无记录),其他记录的前面和后面均只有一个记录,因此这些关系确定了这个表在逻辑上是线性结构。对于表中的一条记录来说,学号、姓名等数据元素,也符合一一对应的线性关系。这个表可以用一片连续的内存单元(如数组)来存放这些记录,也可以用链表的形式随机存放各个记录,这就是数据的存储结构。在这个存储结构的基础上,可实现对表中的数据进行查询、修改、删除等操作。

例:利用树形结构描述回题。计算机文住系统中,根口录下有很多子目录和文件,每个子目录又包含多个下级子日录和文件,但每个子日录只有一个父日录。这是一种典型的树形结构,数据与数据之间成一对多的关系(一个日录下存在多个文件),这是一种典型的非线性关系结构。在各种棋类活动中,存在不同的棋盘状态,不回的前量预测。不同的对弈策略,这些状态和方法很难用数学公式进行表达,因为棋局之间的关系往往不是线性的。因此需要用非数值型数据进行描述,而利用“树形结构”描述棋盘状态,非常有利于回题分析和解决。

例:利用图形结构对问题进行描述。美国化学与生物工程师阿马尔(Luis Amaral)发明了一种足球评分系统,在模型中,球队被看作网络,球员就是其中的节点,模型重点分析球员之间的传球而不是个人表现。传球线路构成了一个网状图形结构,节点与节点之间成多对多的关系,是一种非线性结构。另外,交叉路口交通灯的管理问题、哥尼斯堡七桥问题、逻辑电路设计问题、数据库管理系统等问题,用传统的数学模型无法进行描述,必须采用数据结构中的“图”进行描述。

由以上案例可见,描述非数值计算问题的数学模型不再是数学方程式,而是表、树、图之类的数据结构。

▶3.数据结构的定义

数据是计算机处理符号的总称。数据可以是数值型数据,也可以是非数值型数据。数值数据主要有整数和浮点数等,它们主要用于工程计算和科学计算。非数值数据则包括字母、表格、程序代码、符号序列、图形,以及工程问题中的树、图、网、节点等
数据元素之间的关系称为“结构”,数据结构是研究数据的逻辑结构和物理存储结构以及它们之间的相互关系,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。数据结构主要研究三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或运算)。算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

▶4.数据结构的类型

在任何问题中,数据元素之间都不会是孤立的,在它们之间都存在这样或那样的关系,这种数据元素之间的关系称为结构。根据数据元素间关系的不同特性,数据的逻辑结构有4种基本类型:集合结构(无序的松散关系)、线性结构(一一对应关系)、树形结构(一对多关系)和图形结构(多对多关系)。

1)集合结构

集合结构中,数据元素之间的关系是“属于同一个集合”。由于集合是数据元素之间关系极为松散的一种结构,因此也可用其他数据结构来表示。

2)线性结构

线性数据结构的数据元素之间存在一对一关系。线性数据结构有线性表(一维数组、顺序表、链表等),栈,队列等。
数组的优点是数据插入速度快。数组的缺点是查找慢、删除慢、大小固定。因此,数组主要用于数据量较小,或数据量大小事先可预测的情况。如果对插入速度要求高,可以使用无序数组;如果查找速度很重要,可以使用有序数组,并用二分查找算法。在有序数组中进行遍历很快,而无序数组不支持这种功能。
链表的优点是在空间上,链表可以随意扩大,动态地添加或删除元素,不会引起元素的移动,因为元素增减只需要调整指针即可。顺序链表的缺点是查找不方便,只能通过指针顺序访问,不能随机查找。如果需要存储的数据不能预知,或者需要频繁插入和删除数据时,可以考虑使用链表。当有新的元素加入时,链表可以开辟新的存储空间。
栈的优点是提供后进先出的存取方式;缺点是存取数据项很慢。

队列提供先进先出的存取方式;缺点是存取数据项很慢。

3)树形结构

树形数据结构的数据元素之间存在一对多的关系。树形数据结构有二叉树、B树、B+树(注意没有B—树)、最优二叉树(哈夫曼树)、二叉搜索树(二叉排序树)、红黑树等。树是一种最常用的高效数据结构,许多高效算法可以用这种数据结构来实现。树的优点是查找、插入、删除都很快(如果树保持平衡);缺点是删除算法复杂。

4)图形结构

图形数据结构的数据元素之间存在多对多的关系,图形结构有无向图和有向图。如果图形结构中的边具有不同的值,这种图形结构称为网形结构。图的优点是对现实世界建模方便;缺点是算法相对复杂。

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

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

相关文章

GBASE南大通用读取数据库数据

通过GBASE南大通用 ADO.NET 接口读取GBASE南大通用Server 数据需要下面的步骤: 1) 使用 GBASE南大通用Connection 创建数据库连接对象 2) 使用 GBASE南大通用Command 创建命令对象 3) 使用连接对象打开连接 4) 设置命令对象的 CommandText 属性,指明…

1.基本数据类型与变量

1.基本数据类型与变量 1.1 基本数据类型 Java属于强类型语言,强类型语言必须为每一个变量声明一种类型。 Java中基本数据类型也称做简单数据类型,包括以下八种 1、整型 byte 、short 、int 、long 2、浮点型 float 、 double 3、字符型 char 4…

贪吃蛇(三)绘制蛇身

绘制蛇身的逻辑不难,存储上面使用结构体。 第一行和第十九行绘制--其它行,绘制|,分别在头尾处。 (1) 扫描蛇身,如果扫描到则绘制[]。 (2) 扫描蛇身,如果扫描不到则绘制空白。 #include"curses.h"struct Sn…

文件操作入门指南

目录 一、为什么使用文件 二、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 三、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 四、文件的顺序读写 ​编辑 🌻深入理解 “流”: 🍂文件的顺序读写函数介绍: …

爬虫实战案例 -- 爬取豆瓣读书网页内容

进入网站检查信息 , 确定请求方式以及相关数据 找到爬取目标位置 开始敲代码 # 链接网站 def url_link(url):res requests.get(url,headers headers)response res.textparse_data(response)# 爬取信息 def parse_data(data):msg <li\sclass"media\sclearfix…

处理器管理

(1) 为什么程序并发执行会产生间断性特征&#xff0c;并失去封闭性和可再现性&#xff1f; 解&#xff1a; 之所以产生间断性特征是因为多个程序在并发执行时&#xff0c;需要为了完成同一项任务而相互合作&#xff0c;并发执行的程序间的这种相互制约导致了“暂停—执行—暂…

Java Web Day03_CSS样式

一、超级链接伪类 <a href”#”>超级链接</>a:link 未点击前 a:hover 鼠标悬停 a:active 鼠标正在点击&#xff08;左键按着不放&#xff09; a:visited 点击后 加载顺序一般我们是按照&#xff1a;link -> visited -> hover -> active 列表样式 list-…

07-微服务架构之问题和解决方案的探讨

文章目录 前言一、服务发现与治理二、分布式数据管理三、分布式事务管理四、跨服务调用管理五、版本控制与发布管理六、运维管理 总结 前言 在上一章中&#xff0c;我们已经详细探讨了微服务设计的基本原则和步骤。现在&#xff0c;我们将开始实际运用微服务架构&#xff0c;然…

在 CentOS 上使用 Docker 运行 RabbitMQ

在 CentOS 上使用 Docker 运行 RabbitMQ 使用Docker来运行RabbitMQ非常方便&#xff0c;以下是一个简单的步骤&#xff0c;以YAML配置文件方式创建和运行RabbitMQ容器。 构建容器 创建Docker Compose文件 创建一个docker-compose.yml文件&#xff0c;内容如下&#xff1a; …

C# 将 Word 转化分享为电子期刊

目录 需求 方案分析 相关库引入 关键代码 Word 转 Pdf Pdf 转批量 Jpeg Jpeg 转为电子书 实现效果演示 小结 需求 曾经的一个项目&#xff0c;要求实现制作电子期刊定期发送给企业进行阅读&#xff0c;基本的需求如下&#xff1a; 1、由编辑人员使用 Microsoft Word…

KL散度、CrossEntropy详解

文章目录 0. 概述1. 信息量1.1 定义1.2 性质1.3 例子2. 熵 Entropy2.1 定义2.2 公式2.3 例子3. 交叉熵 Cross Entropy3.1 定义3.2 公式3.3 例子4. KL 散度(相对熵)4.1 公式

vue之全局请求loading

场景&#xff1a;我们往往在项目中会因为表单重复提交而烦恼&#xff0c;往往都会想到很高大上的两个词语——防抖、节流。但网上的很多方法都还是不够灵活、通用&#xff0c;那么下面介绍一下我的方法&#xff08;在最后&#xff09; 页面loading 往往都是一个页面写一堆loa…

MyBatis-Plus如何 关闭SQL日志打印

前段时间公司的同事都过来问我&#xff0c;hua哥公司的项目出问题了&#xff0c;关闭不了打印sql日记&#xff0c;项目用宝塔自己部署的&#xff0c;磁盘满了才发现大量的打印sql日记&#xff0c;他们百度过都按照网上的配置修改过不起作用&#xff0c;而且在调试时候也及为不方…

docker查看日志

1、查看容器所有日志 docker logs <容器名称或ID> 2、查看容器最新日志 docker logs -f <容器名称或ID> 3、查看指定时间范围内的容器日志 docker logs --since<开始时间> --until<结束时间> <容器名称或ID> docker logs --since2022-01-0…

mysql的asc和desc全称

原文&#xff1a;http://t.csdnimg.cn/BJ2sUhttp://t.csdnimg.cn/BJ2sU

[AutoSar]基础部分 RTE 02 S/R Port 显式/隐式

目录 关键词平台说明一、显式&#xff08;Explicit&#xff09;和隐式&#xff08;Implicit&#xff09;1.1 显式模式1.1.1code 二、隐式模式2.1 code 三、区别 关键词 嵌入式、C语言、autosar、EcuM、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语…

字符串逆序输出

逆序输出就是本来abc输出的&#xff0c;然后我想让他输出成cba&#xff0c;那么我们还是要用到for循环&#xff0c;只不过原先是从零开始往上加&#xff0c;这回呢&#xff0c;是从上面往下减 我们观察上面这个图片&#xff0c;我们想要输出olleh&#xff0c;那么我们就要从4开…

2024山东养老展,2024济南养老用品展览会5月27日开幕

飞鲨展览第六届中国&#xff08;济南&#xff09;国际养老服务业展览会&#xff0c;将于2024年5月27-29日举办&#xff1b; CSOLDE 2024第6届中国&#xff08;济南&#xff09;国际养老服务业展览会&#xff08;CSOLDE山东老博会&#xff09; CSOLDE 2024 sixth China (Jinan)…

2023 英特尔On技术创新大会直播 |探索视觉AI的无限可能

2023 英特尔On技术创新大会直播 | 探索视觉AI的无限可能 前言一未来的 AI&#xff1a;释放视觉 AI 真正潜力二AI技术突破、视觉Al挑战及前沿研究创新三全尺度视觉学习全尺度视觉学习示例1.GridConv 实现三维人体姿态估计更高准确率2.KW 预训练及迁移模型性能3.无数据增强稠密对…

Gin之GORM事务(转账操作)

禁用默认事务的操作 为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。 // 全局禁用 db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{SkipDef…