第一百零二天学习记录:数据结构与算法基础:初识数据结构与算法

news2024/11/17 12:29:20

管理系统模型(仓库管理系统)—顺序表

操作对象之间的关系:线性关系 数据结构:线性数据结构、线性表 (例如:学生成绩管理系统、人事管理系统、仓库管理系统、通讯录等。)
操作对象:若干行数据记录
操作算法:查询、插入、修改、删除等
在这里插入图片描述

人机对弈模型(三子棋)—树

之所以能对弈:策略已经输入计算机,可以根据当前棋盘格局来预测棋局发展的趋势,甚至最后结局。
计算机的操作对象:各种棋局状态,即描述棋盘的格局信息
计算机的算法:走棋,即选择一种策略使棋局状态发生变化(由一个格局派生出另一个格局)
操作对象之间的关系:非线性关系、树
数据与数据成一对多的关系,是一种典型的非线性关系结构:树形结构。
在这里插入图片描述

地理信息处理模型(高德地图)—图

地图导航最短路径
网状结构
问题:找到图中两点之间的最短路径或最经济路径
操作对象:各地点及路的信息。
计算机算法:设置信号灯,求出各个可同时通行的路的集合。
对象之间的关系:非线性关系,网状结构。
在这里插入图片描述
综上所述
这些问题的共性是都无法用数学的公式或方程来描述,是一些“非数值计算”的程序设计问题。
描述非数值计算问题的数学模型不是数学方程,而是诸如表、树和图之类的具有逻辑关系的数据。
数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。

基本概念和术语

数据、数据元素、数据项和数据对象

数据是能输入计算机且能被计算机处理的各种符号的集合
数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。也简称为元素,或称为记录、结点或顶点。
数据项构成数据元素的不可分割的最小单位。
数据、数据元素、数据项三者之间的关系:
数据>数据元素>数据项
例:参赛表>运动员记录>参赛编号、姓名……

数据对象是性质相同的数据元素的集合,是数据的一个子集。
例如:整数数据对象是集合N={0,±1,±2,…}

数据元素与数据对象

数据元素是组成数据的基本单位,与数据的关系:是集合的个体
数据对象是性质相同的数据元素的集合,与数据的关系是:集合的子集

数据结构

1、数据元素不是孤立存在的,它们之间存在着某种关系,数据元素相互之间的关系称为结构(Structure)
2、是指相互之间存在一种或多种特定关系的数据元素集合
3、或者说,数据结构是带结构的数据元素的集合

数据结构包括以下三个方面的内容:
1、数据元素之间的逻辑关系,也称为逻辑结构。
2、数据元素及其关系在计算机内存中的表示(又称为映像),称为数据的物理结构或数据的存储结构。
3、数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。

数据结构的两个层次

逻辑结构

1、描述数据元素之间的逻辑关系
2、与数据的存储无关,独立于计算机
3、是从具体问题抽象出来的数学模型

物理结构(存储结构)

1、数据元素及其关系在计算机存储器中的结构(存储方式)
2、是数据结构在计算机中的表示

逻辑结构与存储结构的关系

1、存储结构是逻辑关系的映象与元素本身的映象。
2、逻辑结构是数据结构的抽象,存储结构是数据结构的实现。
3、两者综合起来建立了数据元素之间的结构关系。

逻辑结构的种类

划分方法一

(1)线性结构
有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。
例如:线性表、栈、队列、串
(2)非线性结构
一个结点可能有多个直接前趋和直接后继
例如:树、图


一些在浏览技术博客过程中经常出现却因为没有学习数据结构而不了解所产生的问题,通过问ChatAI得出的解答:

问:链表在数据结构逻辑结构的划分中属于线性结构还是非线性结构?链表和栈,队列,串有关系吗?
答:
链表在数据结构中属于线性结构。
线性结构是指数据元素之间存在一对一的前后关系,链表就是一种典型的线性结构。在链表中,每个元素都包含一个指向下一个元素的指针,通过这种方式将所有元素按顺序连接起来。
链表与栈、队列、串都有关系,它们都是常见的数据结构,可以通过链表来实现。

  • 栈(Stack)是一种后进先出(Last-In-First-Out,LIFO)的数据结构,可以通过链表来实现链式栈。
  • 队列(Queue)是一种先进先出(First-In-First-Out,FIFO)的数据结构,可以通过链表来实现链式队列。
  • 串(String)是由零个或多个字符组成的有限序列,可以通过链表来实现链式串。
    通过使用链表来实现栈、队列、串等数据结构,可以灵活地进行插入、删除等操作,并且不需要事先知道数据元素的个数。

问:堆属于非线性结构中的一种特殊的树吗?
答:
是的,堆是非线性结构中的一种特殊的树。
在数据结构中,线性结构中的元素之间存在一对一的关系,例如链表、数组等。而非线性结构中的元素之间存在一对多的关系,例如树、图等。
堆是一种特殊的树型数据结构,它可以被视为一种完全二叉树(或者是近似完全二叉树)。在堆中,树中的每个节点都有一个值,而且具有以下两个特性:

  1. 最大堆(Max Heap):对于堆中的任意节点,其值都大于或等于其子节点的值。
  2. 最小堆(Min Heap):对于堆中的任意节点,其值都小于或等于其子节点的值。
    堆常被用于实现优先队列等特殊的数据结构,其中元素的优先级由其在堆中的值决定。由于堆具有特殊的性质,可以高效地进行堆化、插入和删除等操作,常用于解决许多算法和数据处理问题。

划分方法二—四类基本逻辑结构

1、集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其他关系。
2、线性结构:结构中的数据元素之间存在着一对一的线性关系。
3、树形结构:结构中的数据元素之间存在着一对多的层次关系。
4、图状结构或网状结构:结构中的数据元素之间存在着多对多的任意关系。

存储结构的种类

四种基本的存储结构:
1、顺序存储结构
2、链式存储结构
3、索引存储结构
4、散列存储结构

顺序存储结构

1、用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。
2、C语言中用数组来实现顺序存储结构。

链接存储结构:

1、用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。
2、C语言中用指针来实现链式存储结构。

索引存储结构:

1、在存储结点信息的同时,还建立附加的索引表。
例:通信录
2、索引表中的每一项称为一个索引项
3、索引项的一般形式是:(关键字,地址)
4、关键字是能唯一识别一个结点的那些数据项。
5、若每个结点在索引表中都有一个索引项,则该索引表称之为稠密索引。若一组结点在索引表中只对应一个索引项,则该索引表称之为稀疏索引。

散列存储结构

根据结点的关键字直接计算出该结点的存储地址。
散列存储结构,也称为哈希表,是一种常见的数据结构,用于存储和检索数据。它通过把数据映射到数组的特定位置来实现快速访问。
举个例子,假设我们要实现一个电话号码簿,其中存储了人名与对应的电话号码。我们可以使用散列存储结构来快速查找电话号码。
首先,我们创建一个具有固定大小的数组,大小根据预期存储的记录数确定。假设我们选择一个大小为10的数组。
接下来,我们定义一个散列函数,该函数将人名作为输入,并将其转换为整数。
例如,我们可以使用简单的散列函数,将每个人名的字符转换为ASCII码,并求和得到一个整数值。例如,“Alice"对应的ASCII码之和为65+108+105+99+101=478。
然后,我们使用散列函数计算每个人名对应的散列值,并将其作为索引值,将电话号码存储在数组中。
假设我们要存储电话号码簿中的三个记录:
Alice: 1234567890
Bob: 9876543210
Carol: 4567890123
使用散列函数,将它们映射到数组中的位置:
Alice -> 散列值: 478 -> 存储在数组索引为8的位置
Bob -> 散列值: 308 -> 存储在数组索引为8的位置(发生碰撞)
Carol -> 散列值: 649 -> 存储在数组索引为9的位置
在查询电话号码时,我们只需使用相同的散列函数,将人名转换为散列值,并在数组中查找该位置的数据。
例如,要找到Bob的电话号码,我们将散列函数应用于"Bob”,得到散列值308,然后在索引为8的数组位置找到电话号码9876543210。
这就是散列存储结构的基本原理。它提供了快速的插入和查找操作,使得访问大量数据变得高效。
当然,实际的散列存储结构可能会使用更复杂的散列函数和解决碰撞的方法,但以上示例展示了其基本概念和用法。

数据类型和抽象数据类型

1、在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。
例如,C语言中:
提供int,char,float,double等基本数据类型
数组、结构、共用体、枚举等构造数据类型
指针、空(void)类型
用户也可以typedef自己定义数据类型
2、一些最基本数据结构可以用数据类型来实现,如数组、字符串等。
3、而另一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示。
4、高级语言中的数据类型明显地或隐含地规定了在程序执行期间变量和表达的所有可能的取值范围,以及在这些数值范围上所允许进行的操作。
例如:C语言中定义变量i为int类型,就表示i是[-min,max]范围的整数,在这个整数集上可以进行+、-、*、\、%等操作
5、数据类型的作用
①、约束变量或常量的取值范围
②、约束变量或常量的操作

数据类型

定义:数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。

数据类型=值的集合+值集合上的一组操作

抽象数据类型

是指一个数学模型以及定义在此数学模型上的一组操作。
1、由用户定义,从问题抽象出数据模型(逻辑结构)
2、还包括定义在数据模型上的一组抽象运算(相关操作)
3、不考虑计算机内的具体存储结构与运算的具体实现算法

抽象数据类型的形式定义

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

一个抽象数据类型的定义格式如下:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}抽象数据类型名
其中:
1、数据对象、数据关系的定义用伪代码描述
2、基本操作的定义格式为:
基本操作名(参数表)
初始条件:(初始条件描述)
操作结果:(操作结果描述)

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

抽象数据类型(ADT)定义举例:Circle的定义

ADT抽象数据类型名{
Data
数据对象的定义
数据元素之间逻辑关系的定义
Operation
操作1
初始条件
操作结果描述
操作2
……
操作n
……
}ADT抽象数据类型名

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

抽象数据类型(ADT)定义举例:复数的定义

ADT Complex{
D={r1,r2|r1,r2都是实数}
S={<r1,r2>|r1是实部,r2是虚部}
assign(&C,v1,v2)
初始条件:空的复数C已存在
操作结果:构造复数C,r1,r2分别被赋以参数v1,v2的值。
destroy(&C)
初始条件:复数C已存在
操作结果:复数C被销毁
}ADT Complex

抽象数据类型中的基本操作:

Assign(&Z,v1,v2)
操作结果:构造复数Z,其实部和虚部,分别被赋以参数v1,v2值。
Destroy(&Z)
操作结果:复数Z被销毁。
GetReal(Z,&realPart)
初始条件:复数已存在。操作结果:用realPart返回复数Z的实部值。
GetImag(Z,&ImagPart)
初始条件:复数已存在。操作结果:用ImagPart返回复数Z的虚部值。
Add(z1,z2,&sum)
初始条件:z1,z2是复数。操作结果:sum返回两个复数z1,z2的和。
……

在这里插入图片描述
注:截图转自王卓数据结构教学视频
在这里插入图片描述
注:截图转自王卓数据结构教学视频

抽象数据类型的表示与实现

一个问题抽象为一个抽象数据类型后,仅是形式上的抽象定义,还没有达到问题解决的目的,要实现这个目标,就要把抽象的变成具体的,即抽象数据类型在计算机上实现,变成一个能用的具体的数据类型。
C语言实现抽象数据类型
1、用已有数据类型定义描述它的存储结构
2、用函数定义描述它的操作

抽象数据类型可以通过固有的数据类型(如整型、实型、字符型等)来表示和实现。
即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。

用C语言实现抽象数据类型的定义

例如:抽象数据类型“复数”的实现:

typedef struct{
	float realpart;    //实部
	float imagpart;    //虚部
}Complex               //定义复数抽象类型

void assign(Complex* A,float real,float imag);   //赋值
void add(Complex* A,float real,float imag);      //A+B
void minus(Complex* A,float real,float imag);    //A-B
void multiply(Complex* A,float real,float imag); //A*B
void divide(Complex* A,float real,float imag);   //A/B

void assign(Complex* A,float real,float imag)
{
	A->realpart=real;  //实部赋值
	A->imagpart=imag;  //虚部赋值
	                   //End of assign()
}
... ... ... ...

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

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

相关文章

OWASP 定义的大模型应用最常见的10个关键安全问题

7月15日之前入驻华为云&#xff0c;可参与Check抽奖活动&#xff0c;抽奖活动在文末 1. 《OWASP 大模型应用最常见的10个关键安全问题》项目简介&#xff08;OWASP TOP10 LLMs Project&#xff09; *OWASP Top 10 for Large Language Model Applications OWASP 大模型应用程序…

vue3使用腾讯地图(‘关键词搜索、逆地址解析‘)

1.登录腾讯地图位置服务进入控制台 申请腾讯地图开发者进入控制台申请自己的key 腾讯位置服务 - 立足生态&#xff0c;连接未来 2.进入vue项目的public文件下的index.html 引入腾讯资源包&#xff0c;并把申请的key填入 <script src"https://map.qq.com/api/js?v2…

文心一言 VS 讯飞星火 VS chatgpt (57)-- 算法导论6.4 1题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;57&#xff09;-- 算法导论6.4 1题 一、参照图 6-4 的方法&#xff0c;说明 HEAPSORT 在数组 A(5&#xff0c;13&#xff0c;2&#xff0c;25&#xff0c;7&#xff0c;17&#xff0c;20&#xff0c;8&#xff0c;4)上的操作过程…

怎么修复损坏的视频文件?视频文件修复办法分享!

随着科技的不断发展&#xff0c;我们的生活中已经离不开各种类型的视频文件。因为各式各样的原因&#xff0c;有时候我们的视频文件可能会损坏。 而损坏的视频文件通常是无法正常播放&#xff0c;这无疑会给我们的生活和工作造成极大的困扰。那么&#xff0c;怎么修复损坏的视…

【Linux学习】记录下Linux的常用基本指令~

1、Linux是一个操作系统&#xff0c;和windows是“并列”关系。Linux已经成为"世界第一大操作系统"。 2、Linux这种使用命令的方式比图形化界面的好处&#xff1f; &#xff08;1&#xff09;节省系统资源&#xff1a;运行图形化界面需要让系统付出一些额外开销&am…

stm32(时钟和中断事件知识点)

一、复位和时钟控制&#xff08;RCC&#xff09; 复位 系统复位 当发生以下任一事件时&#xff0c;产生一个系统复位&#xff1a; 1. NRST引脚上的低电平(外部复位) 2. 窗口看门狗计数终止(WWDG复位) 3. 独立看门狗计数终止(IWDG复位) 4. 软件复位(SW复位) 5. 低功耗管…

软件为什么需要进行应急演练脚本?

软件为什么需要进行应急演练脚本&#xff1f;在当今互联网时代&#xff0c;安全问题愈加突出&#xff0c;不断有新的网络攻击方式不断涌现。针对软件系统的安全漏洞和攻击活动不断增加&#xff0c;软件应急演练变得尤为重要。 首先&#xff0c;应急演练可以帮助软件团队建立应急…

C++11可变参数模板,lambda表达式,包装器

目录 可变参数模板 lambda表达式 问题的引入 lambda表达式语法 捕捉列表的使用 函数对象和lambda表达式 function包装器 可变参数模板 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板&#xff0c;相比C98/&#xff0c;类模版和函数模版中只能…

基于redis实现延时队列(一)

背景 最近项目中需要对一条数据&#xff0c;在半小时候更改其状态&#xff0c;类似于提交商城订单半小时后未支付的订单需要更改为超时状态&#xff0c;当然这个解决方案有很多&#xff0c;最好的解决方案是用MQ的死信队列&#xff1b;但由于项目中没有引入MQ&#xff0c;故本…

PMP-质量管理的重要性

本篇文章主要是方便从事于项目管理的“初学者”们了解质量管理的重要性&#xff01;&#xff01;&#xff01; 一、什么是质量管理 项目质量管理包括把组织的质量政策应用于规划、管理、控制项目和产品质量要求&#xff0c;以满足相关方目标的各个过程。此外&#xff0c;项目质…

Latex公式炫酷技巧

最近看到一个炫酷的latex公式用法&#xff0c;特意在此记录一下 效果如下 latex代码如下 \begin{equation}\mathcal{L}_{mot}^{\textcolor{magenta}{\bullet}} \frac{1}{\sum_{i1}^{N}{s_i^l}}\sum_{i1}^{N}\Big\Vert{s}^{l}_i(\mathbf{\hat{f}}_i-\mathbf{f}^{fg}_i)\Big…

网络安全系统教程+学习路线

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

【MySQL系列】表的学习及基本操作

「前言」文章内容大致是数据库表的基本操作 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「句子分享」 人生当苦无妨&#xff0c;良人当归即好。 ——烽火戏诸侯《雪中悍刀行》 目录 一、创建表二、修改表三、 删除表 一、创建表 创建…

组合模式的例子

// 组合模式的接口 public interface AccessDecisionVoter {// 投票结果的常量int ACCESS_GRANTED 1;int ACCESS_ABSTAIN 0;int ACCESS_DENIED -1;// 投票方法&#xff0c;根据用户和请求判断是否授权int vote(User user, Request request); }// 组合模式的叶子节点&#xf…

Android中system/bin/Input命令 -- Android12

IMS:Android中Input命令--Android12 1、Android12 Input命令更新1.1 shell脚本1.2 InputShellCommand#onCommand 命令解析 2、Input相关命令参数2.1 text2.2 keyevent2.3 tap2.4 swipe2.5 draganddrop2.6 press2.7 roll2.8 motionevent2.9 keycombination2.10 默认handleDefaul…

2023 WAIC图技术激活数据要素论坛圆满召开!

7月6日&#xff0c;以“智联世界 生成未来”为主题的2023世界人工智能大会&#xff08;WAIC 2023&#xff09;在上海隆重开幕。作为大会唯一的图技术论坛&#xff0c;“图技术激活数据要素论坛”也如期举行。 论坛现场&#xff0c;学术界专家学者、头部银行代表、产业界大咖齐聚…

二分图博弈(知识总结+例题)

思路来源 gzchenben的ppt 算法学习笔记(74): 二分图博弈 - 知乎 https://www.cnblogs.com/Zeardoe/p/16534557.html 知识点总结 以下部分摘自知乎&#xff1a;算法学习笔记(74): 二分图博弈 - 知乎 二分图博弈模型 给出一张二分图和起始点 H &#xff0c; A和B轮流操作…

Endnotes引用

准备不用zetro了&#xff0c;主要学校endnotes免费 该说不说&#xff0c;zetro拖入pdf直接识别并导入的功能是真的好用&#xff0c;添加备注也方便 可惜文献太多放不下了&#xff0c;扩容要加钱。 啧。算了算了。 这里主要介绍Endnotes中的文献怎么在word内引用&#xff0c…

SpringBoot 插件化开发模式,强烈推荐!

一、前言 插件化开发模式正在很多编程语言或技术框架中得以广泛的应用实践&#xff0c;比如大家熟悉的jenkins&#xff0c;docker可视化管理平台rancher&#xff0c;以及日常编码使用的编辑器idea&#xff0c;vscode等&#xff0c;随处可见的带有热插拔功能的插件&#xff0c;…

BitLocker 驱动器加密管理

为了有效地保护数字数据&#xff0c;应对其进行加密&#xff0c;以便只有授权用户才能访问。BitLocker 是某些 Windows 操作系统上可用的本机加密工具&#xff0c;可以为个人用户轻松加密Windows计算机。 什么是 BitLocker 加密 BitLocker 加密是 Windows 操作系统的内置安全…