数据结构-绪论

目录

  • 前言
  • 一、从问题到程序
  • 二、数据结构的研究内容
  • 三、理解数据结构
    • 3.1 数据
    • 3.2 结构
      • 3.2.1 逻辑结构的分类
      • 3.2.2 存储结构的分类
    • 3.3 数据结构
  • 四、数据类型和抽象数据类型
    • 4.1 抽象数据类型的定义格式
    • 4.2 抽象数据类型的实现
  • 总结

前言

本篇文章先介绍数据结构的研究内容,然后再介绍如何去理解数据结构,着重介绍表示数据结构关系的逻辑结构和存储结构(物理结构)。

一、从问题到程序

用计算机实现问题求解,实质上就是在计算机中建立一个解决问题的模型。
为一个问题建立一个正确的求解程序,一般经历以下四个阶段:

  1. 分析阶段
    该阶段的任务是,首先是理解用户的需求是什么;然后设计者对用户的需求进行深入分析,使用规范说明语言,给出问题的需求模型
    又或者是通过分析问题,提取操作对象并找出操作对象之间的关系,然后用数学语言描述操作对象之间的关系,最后给出问题的数学模型
  2. 设计阶段
    该阶段的任务是,设计者建立求解问题的实现模型,重点是数据结构的设计和算法的设计
    一般而言,设计过程需要从粗到细,经过多次精化才能完成。
  3. 编码阶段
    该阶段的任务是,编码人员选择适当的程序设计语言把设计阶段的结果编写成可执行程序。
  4. 调试和维护阶段
    该阶段的任务是,测试人员使用足够的例子调试编写的程序,发现和排除程序代码中的错误;
    最后,在计算机上执行程序,获得问题的解。
    程序投入使用后,需要解决在使用过程中发现的隐含错误和根据使用中提出的要求进行必要的维护和完善。

使用计算机为实际问题构建求解程序的流程图如图1.1所示。
在这里插入图片描述

图1.1 构建求解程序流程图

数据结构的设计处于设计阶段,那数据结构的研究内容是什么呢?

二、数据结构的研究内容

数据结构是一门主要研究非数值计算,然后用计算机表示数据元素以及数据元素之间的关系,最后用计算机实现对数据元素的各种操作的学科。
描述非数值计算问题的数学模型不是数学方程,而是诸如表、树、图等具有逻辑关系的结构。

例子1,学生信息管理系统的一个学生信息表
在这里插入图片描述

数据元素:一个学生的信息
数据元素之间的关系:线性结构(逻辑结构)
操作:对一个学生的信息进行查询、修改、增加、删除等操作

例子2,文件系统的目录结构
在这里插入图片描述
在这里插入图片描述

数据元素:目录
数据元素之间的关系:树形结构(逻辑结构)
操作:对一个目录进行删除、修改、查看、新增等操作

例子3,地图导航
在这里插入图片描述
数据元素:地点和边
数据元素之间的关系:图结构(逻辑结构)
操作:寻求两点之间最短路径、寻求两点之间的最短耗时等

以上这些问题,都是无法使用数学公式或数学方程描述的问题,是一些非数值计算的程序设计问题。
数据结构与算法的研究内容如下:
在这里插入图片描述

在了解数据结构的研究内容后,请问什么是数据结构?

三、理解数据结构

为了更好的理解数据结构,可以先将其拆分为两部分:数据和结构,最后再进行总体理解。

3.1 数据

  • 数据
    概念:能够输入计算机且能够被计算机处理的各种符号的集合
    在这里插入图片描述
    例如,在一个学生信息管理系统中,学生信息表就是数据。
  • 数据元素
    概念:是数据的基本单位,在计算机程序中通常被作为一个整体进行考虑和处理
    数据元素简称为元素,也可以称为记录或结点
    例如,在一个学生信息管理系统中,学生信息表的一个学生信息就是一个数据元素。
  • 数据项
    概念:构成数据元素的不可分割的最小单位
    例如,在一个学生信息管理系统中,学生信息表的学号字段就是一个数据项。
  • 数据对象
    概念:是性质相同的数据元素的集合,是数据的一个子集
    例如,在一个学生信息管理系统中,学生信息表的同一个专业的学生信息就是一个数据对象。

数据元素与数据对象的关系:
从集合的角度看,把数据当成一个集合
数据元素是数据的一个元素
数据对象是数据的一个子集

3.2 结构

结构可以分为逻辑结构存储结构(物理结构)

  • 逻辑结构:它定义了数学模型中的元素和元素之间的相互关系。
    描述数据元素之间的逻辑关系
    与数据的存储无关,独立与计算机
    是从具体问题抽象出来的数学模型
  • 存储结构:它给出了数学模型的具体表示方式,包括元素的表示,元素与元素之间的关系表示。存储结构也可以理解为数据元素、数据元素之间的关系在计算机内存中的表示。
    数据元素及其关系在计算机存储器中的结构
    是数据结构在计算机中的表示

逻辑结构与存储结构的关系:
逻辑结构是数据结构的抽象
存储结构是数据结构的实现

两者综合起来建立了数据元素之间的结构关系。

3.2.1 逻辑结构的分类

  • 集合结构
    概念:结构中的数据元素之间除了同属于一个集合的关系外,无任何其他关系
    在这里插入图片描述

  • 线性结构
    概念:结构中的数据元素之间存在着一对一的关系
    在这里插入图片描述

  • 树形结构(非线性结构)
    概念:结构中的数据元素之间存在着一对多的层次关系
    在这里插入图片描述

  • 图结构(非线性结构)
    概念:结构中的数据元素之间存在着多对多的任意关系
    在这里插入图片描述

各种逻辑结构之间具有以下包含关系:
集合结构 ⊆ 线性结构 ⊆ 树形结构 ⊆ 图结构

3.2.2 存储结构的分类

  • 顺序存储结构
    用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置表示
  • 链接存储结构
    用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针(或引用)表示
  • 散列存储结构
    又称为关键码-地址转换法
    选择适当的散列(杂凑)函数,根据关键码的值将数据元素映射到给定的存储空间(散列表)中
  • 索引存储结构
    存储结点信息的同时,建立附加的索引表。索引是由索引项组成的结构,每个索引项包含一个结点的关键码和该结点的存储位置

3.3 数据结构

数据结构包含以下三个内容:
1. 数据元素
2. 数据元素之间的关系(包含逻辑结构关系和存储结构关系)
3. 数据元素的运算和操作,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现

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

  • 类型(Type)
    是一组值(或对象)的集合
    例如,布尔作为一种类型是由真(true)和假(false)两个值组成的集合

  • 数据类型(Data Type)
    是一组性质相同的值的集合以及定义在这个值集合上的一组操作的总称
    数据类型=值的集合+值集合上的一组操作

  • 抽象数据类型(Abstract Data Type,ADT)
    是指一个数学模型以及定义在此数学模型上的一组操作
    其抽象掉了数据类型中值的具体表示方式
    其抽象掉了数据类型中定义的各种操作的实现算法
    抽象数据类型中元素间内在的相互依赖关系称为逻辑结构
    不考虑在计算机内的具体存储结构和运算的具体实现算法

4.1 抽象数据类型的定义格式

抽象数据类型可用(D,S,P)三元组表示
D表示数据对象
S是D上的关系集
P是D上的基本操作集

一个抽象数据类型的定义格式如下:

ADT 抽象数据类型名{
		数据对象:<数据对象的定义>
		数据关系:<数据关系的定义>
		基本操作:<基本操作的定义>

}ADT 抽象数据类型名

数据对象和数据关系的定义用伪代码描述
基本操作的定义格式:
	基本操作名(参数表)
	初始条件:<初始条件描述>
	操作结果:<操作结果描述>
基本操作定义格式说明:
	参数表说明:
		赋值参数只为操作提供输入值
		引用参数以&开头,除可为操作提供输入值外,还可作为操作结果返回
	初始条件说明:
		描述操作执行之前操作对象和参数应满足的条件。若不满足,则操作失败,返回对应出错信息
		若初始条件为空,则省略
	操作结果说明:
		说明操作正常完成之后,操作对象的变化状况和应返回的结果

例如,定义圆的抽象数据类型

ADT Circle{
		数据对象:D={r,x,y|r,x,y均为实数}
		数据关系:S={<r,x,y>|r是半径,<x,y>是圆心}
		基本操作
			Circle(&C,r,x,y)
				操作结果:构造一个圆
			double Area(C)
				初始条件:圆C存在
				操作结果:计算圆C的面积
			double Circumference(C)
				初始条件:圆C存在
				操作结果:计算圆C的周长
			...
}ADT Circle

4.2 抽象数据类型的实现

在4.1小节中,定义了圆的抽象数据类型,现在利用c语言实现

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<assert.h>


//定义数据类型:圆
struct Circle {
	float radius; //圆半径
	float x;	 //圆心x轴坐标
	float y;	 //圆心y轴坐标	
};
//类型重命名
typedef struct Circle Circle;

//宏定义PI
#define PI 3.141592

//构造一个圆
Circle* newCircle(float r, float x, float y) {
	Circle* circle = (Circle*)malloc(sizeof(Circle));
	if (NULL == circle)
	{
		printf("%s", strerror(errno));
		return NULL;
	}
	printf("circle is build successfully!\n");
	circle->radius = r;
	circle->x = x;
	circle->y = y;
	return circle;
}

//计算圆的面积

double area(Circle* circle)
{
	assert(circle);
	return (circle->radius) * (circle->radius) * PI;
}

//计算圆的周长
double circumference(Circle* circle)
{
	assert(circle);
	return (circle->radius) * PI * 2;
}


//销毁一个圆
void destroyCircle(Circle* circle)
{
	free(circle);
	circle = NULL;
	printf("circle is destoryed!\n");
}


//测试
int main()
{
	Circle* circle = newCircle(3.0,2.0,3.0);
	printf("area = %.6lf\n", area(circle));
	printf("circumference = %0.6lf\n", circumference(circle));
	destroyCircle(circle);
	return 0;
}

总结

数据结构是抽象数据类型的物理实现。
数据结构主要应解决的两个问题:一个是选择存储结构,另一个是实现抽象数据类型中的各种操作。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

php反序列化的一些知识

问题 <?php $raw O:1:"A":1:{s:1:"a";s:1:"b";}; echo serialize(unserialize($raw)); //O:1:"A":1:{s:1:"a";s:1:"b";}?> php反序列化的时按理说找不到A这个类&#xff0c;但是他没有报错&#xff0c;…

SAR动目标检测系列:【4】动目标二维速度估计

在三大类杂波抑制技术(ATI、DPCA和STAP)中&#xff0c;STAP技术利用杂波与动目标在二维空时谱的差异&#xff0c;以信噪比最优为准则&#xff0c;对地杂波抑制的同时有效保留动目标后向散射能量&#xff0c;有效提高运动目标的检测概率和动目标信号输出信杂比&#xff0c;提供理…

C++学习(23)

#学习自用# union 共用体和结构体相似&#xff0c;但是共用体一次只能占用一个成员的内存&#xff0c;所有成员共用同一地址。 #include<iostream> using namespace std; union A {int int_val;float float_val; }a; int main() {a.float_val 2.0f;cout << a.f…

【AWS SMB 能力最佳实践】利用 MGN 解决方案实现跨AWS账号迁移Amazon EC2 实例、弹性IP地址等资源

文章目录 一、实验情景二、实验关键服务概述2.1 MGN解决方案2.2 VPC对等连接 三、实验架构示意图四、实验具体操作步骤4.0 创建访问密钥4.1 创建VPC资源4.1.1 在源账号上创建VPC4.1.2 在目标账号上创建VPC 4.2 创建对等连接✨4.2.1 发起对等连接请求4.2.2 接受对等连接请求4.2.…

【内含优惠码】重磅发售!《2023年度中国量化投资白皮书》(纸质版)

这是可以公开了解量化行业图景的&#xff0c;为数不多资料。 简介 《2023年度中国量化投资白皮书》由宽邦科技、华泰证券、金融阶、华锐技术、AMD、阿里云、英迈中国等多家机构联合发起编写&#xff0c;并于2024年6月15日正式发布&#xff0c;全书公17万字6大章节勾勒最新量化…

torch.optim 之 Algorithms (Implementation: for-loop, foreach, fused)

torch.optim的官方文档 官方文档中文版 一、Implementation torch.optim的官方文档在介绍一些optimizer Algorithms时提及它们的implementation共有如下三个类别&#xff1a;for-loop, foreach (multi-tensor), and fused。 Chat-GPT对这三个implementation的解释是&#xf…

算法设计与分析 实验4 动态规划法求扔鸡蛋问题

目录 一、实验目的 二、问题描述 三、实验要求 四、实验内容 动态规划法 算法描述 算法伪代码描述 算法复杂度分析 数据测试 二分优化的动态规划法 算法描述 二分优化&#xff1a; 算法伪代码 算法复杂度分析 数据测试 单调决策优化的动态规划法 算法描述 算…

【Ardiuno】实验使用ESP32接收电脑发送的串口数据(图文)

使用ESP32可以非常方便的与电脑进行串口通讯&#xff0c;一般我们可以用串口接收ESP32的输出作为调试使用&#xff0c;今天我们再来实验一下从电脑端向ESP32单片机发送数据。 发送数据程序代码&#xff1a; void setup() {Serial.begin(9600); }void loop() { if(Serial.ava…

股票核心因子解读以及如何从接口获取股票数据信息

目录 1 股票基础信息1.1 股票核心因子1.2 获取股票信息 2 如何从接口获取股票数据2.1 yfinance2.2 finnhub-python2.3 alpha_vantage2.4 efinance2.4 Tushare 3 如何从各大金融平台获取咨询信息3.1 国外3.2 国内 1 股票基础信息 1.1 股票核心因子 基本面因子 因子名称计算公…

前缀和+双指针,CF 131F - Present to Mom

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 131F - Present to Mom 二、解题报告 1、思路分析 很经典的一种把列看作cell 来进行双指针/递推的题型 我们考虑&#xff0c;可以预处理出原矩阵中的所有star 然后我们去枚举矩形的上下边界&#xff0c;把…

java读取wps嵌入式图片思路

这个只写了思路具体代码在文章最后&#xff0c;不想了解得直接去拿代码 了解Excel数据结构 Excel 文件格式后缀xls,xlsx 其实是一个压缩文件&#xff0c;是由多个文件夹以及xml 文件组合为一个文件&#xff0c;xml文件记录了Excel得内容以及样式等信息。加入在桌面新建一个xls…

MySQL之复制(七)

复制 定制的复制方案 分离功能 许多应用都混合了在线事务处理(OLTP)和在线数据分析(OLAP)的查询。OLTP查询比较短并且是事务型的。OLAP查询则通常很大&#xff0c;也很慢&#xff0c;并且不要求绝对最新的数据。这两种查询给服务器带来的负担完全不同&#xff0c;因此它们需…

一文教你在centos 7.9中安装mysql5.7(超级详细)

##red## &#x1f534; 大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff0c;雄雄的小课堂。 一、前言 每当新来一个服务器之后&#xff0c;习惯性的都会安装一个宝塔面板&#xff0c;不为别的&#xff0c;就为了装环境方便点儿&#xff0c;比如常用的jdk,m…

python的赋值运算

# coding:utf-8 x20 #直接复制&#xff0c;直接将20赋值给x y10 xxy #将xy的和赋值给给x print(x) xy print(x)#40 x-y #相当于x-y print(x) #30x*y #xx*y x/y #xx/y print(x) x%2#xx%2 print(x)#0.0 隐式转换 z3 y//z #yy//z y**2#yy**2 #python支持链式赋值 abc100#相当于a10…

【ai】tx2-nx 查看 jetpack 版本信息及对应的tritonserver

3 jtop nvidia@tx2-nx:~$ jtop [WARN] Board missing UNKNOWN (press CTRL + Click) nvidia@tx2-nx:~$ 点击info 可以看到 jetpack是4.6opencv 是4.1.15.1.2 的不适合我 tritonserver2.35.0-jetpack5.1.2-update-2.tgz tritonserver2.19.0-jetpack4.6.1.tgz. 4.6.1<

【已解决】better-scroll在PC端如何开启鼠标滚动以及如何始终显示滚动条

总结 需要安装插件 mouse-wheel 和 scrollbar 在PC端如何开启鼠标滚动? 需要安装官方提供的滚动插件&#xff1a;mouse-wheel https://better-scroll.github.io/docs/zh-CN/plugins/mouse-wheel.html 为了开启鼠标滚动功能&#xff0c;你需要首先引入 mouseWheel 插件&…

华为设备SSH远程访问配置实验简述

一、实验需求: 1、AR1模拟电脑SSH 访问AR2路由器。 二、实验步骤&#xff1a; 1、AR1和AR2接口配置IP&#xff0c;实现链路通信。 2、AR2配置AAA模式 配置用户及密码 配置用户访问级别 配置用户SSH 访问服务 AR2配置远程服务数量 配置用户远程访问模式为AAA 配置允许登录接入用…

Mysql 8.3.0 安装

Mysql 8.3.0 安装地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 下载链接&#xff1a;https://downloads.mysql.com/archives/get/p/23/file/mysql-8.3.0-linux-glibc2.28-x86_64.tar.xz 解压&#xff1a; tar -xvf mysql-8.3.0-linux-glib…

RS-232协议详解:深入理解与实际应用

RS-232协议详解 RS-232协议&#xff0c;也称为推荐标准232&#xff0c;是一种用于串行通信的标准协议。它在计算机和外围设备之间的通信中广泛应用。本文将详细介绍RS-232协议的各个方面&#xff0c;包括其历史、工作原理、信号类型、连接方式、应用场景等。希望通过这篇文章&a…

代码大模型揭秘:从下载到推理,全流程体验StarCoder

选择模型 模型榜单 大模型的发展日新月异&#xff0c;性能强劲的大模型不断涌现&#xff0c;可以实时关注开源大模型的榜单&#xff0c;选择合适自己的大模型 开源大模型榜单 开源代码大模型榜单 模型网站 目前主流的下载模型的网站就是 huggingface 全球社区&#xff0c;…