数据结构学习1
数据结构
为什么要学习数据结构? 数据结构: 程序=数据结构+算法 好的数据结构可以带来更高的运行或者存储效率的算法 学好“数据结构”这门课程,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程、编译原理、人工智能、游戏等都是十分有益的。
怎么学习数据结构? 数据结构: 重点:掌握每种数据结构里数据是怎么组成的,数据间的相互关系和该数据结构的特性 方法: 1,对于不理解的数据结构多画图 2.编写代码,调试,查看各种数据结构在内存中分布
数据结构的起源
“数据结构”作为一门独立的课程在国外是从1968年才开始设立的。 1968年美国高纳德·克努特(Donald Ervin Knuth)教授开创了数据结构的最 初体系,他所著的《计算机程序设计艺术》第一卷《基本算法》是第一本较 系统地阐述数据的逻辑结构和存储结构及其操作的著作。
①数据
定义: 是能被计算机识别,并输入给计算机处理的符号集合。 是描述客观事物的符号,是计算机中可以操作的对象, 举个栗子: 1.我们目标项目存储的整型,浮点型,字符串 2.其他DBMS可以存储的视频,图片 具备两个前提: 1.可以输入到计算机中 2.能被计算机程序处理
②数据元素 定义: 组成数据的,有一定意义的基本单位,在计算机中通常作为整体来处理。也被称为记录。 举个栗子: 我们目标项目数据库中一个表的一行数据(一条记录)
数据项 定义: 一个数据元素可以由若干个数据项组成。 举个栗子: 1·人这样的一个数据元素,可以有姓名,年龄,性别等数据项组成。 2·我们目标项目中数据库里一行记录中的某个字段。 注意: 数据项是数据不可分割的单位。
③数据对象 定义: 是性质相同的数据元素的集合,是数据的子集。 举个栗子: 我们目标项目中数据库里存储的一个表
④数据结构 定义: 是相互之间存在一种或多种特定关系的数据元素的集合 举个栗子: 我们目标项目中数据库里一个表的数据会被多个表用到,那么这个表和其他表是一对多的关系,也可以说是一对多的数据结构
⑤逻辑结构与物理结构
逻辑结构 1.集合结构 2.线性结构 3.树型结构 4.图形结构
物理结构 1.顺序存储结构 2.链式存储结构
逻辑结构 定义: 数据元素之间的逻辑关系。从逻辑关系上描述数据,与数据的存储无关。 为4类:
物理结构 定义: 亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像), 依赖于计算机。 分为2类: 顺序存储、链式存储 举个栗子: “春夏秋冬”四个字符在计算机里的两种存储方式
⑥数据类型 定义: 一组性质相同的值的集合及定义在此集合上的一些操作 举个栗子: C语言中的int,long,char C语言中按照取值的不同可分为: 原子类型:不可以再分解的基本类型,如上面的int,long,char 结构类型:由若干个类型组合而成,是可以再分解的。如:结构体
⑦抽象数据类型 定义 一个数学模型及定义在该模型上的一组操作。 说明 它可理解为数据类型的进一步抽象。即把数据类型和数据类型上的运算捆 在一起,进行封装。是一组逻辑特性,与其在计算机内部如何表示和实现无关。 标准定义 ADT抽象数据类型名 Data 数据元素之间逻辑关系的定义 Operation 操作1 操作2 EndADT
2、算法
①数据结构与算法关系 为什么要学习算法 1,程序=数据结构+算法。数据是程序的中心。数据结构和算法两个概念间 的逻辑关系贯穿了整个程序世界,首先二者表现为不可分割的关系。没有数 据间的有机关系,程序根本无法设计。 2.数据结构与算法关系:数据结构是底层,算法高层。数据结构为算法提供 服务。算法围绕数据结构操作。 3,数据结构的优劣要用通过算法来实现判断。 不谈算法的数据结构你只能了解概念,不能灵活应用。就如同纸上谈兵。,
算法的误区 现在计算机速度这么快不需要学习算法了
②算法的定义 定义: 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列 注意: 指令不是计算机所特有 可以被人执行-->语言文字 可以被计算机执行-->计算机指令
算法的特征 四大特性: 1.输入输出 2.有穷性 3.确定性 4.可行性
算法设计的要求 正确性、可读性、健壮性、时间效率高和储存量低
③算法效率的度量方法 事后统计方法 事前分析估算方法
事后统计方法 主要通过设计好的测试程序和数据,利用计算机及的计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低 缺陷: 1,程序已经写好了,再比较就没意义了。 2.依赖计算机的硬件和软件环境 3.测试数据设计比较困难
事前分析估算方法 程序编制前来依据一套方法对算法进行估算
3、函数的渐进增长
①函数的渐近增长 函数随参数变化值的增长情况,一般用图看比较直观,下图是 几个函数随n的变化的曲线图。
给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的 n>N, f(n)总比g(n)大,那么,我们说f(n)的增长快于g(n) 函数的渐进增长可以忽略加法常数、与最高次项相乘的常数并不重要、最高次项的指数大的,函数随着n的增长,结果也会变得增长特别快。
判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高阶)的阶数
②算法的时间复杂度 算法时间复杂度定义: 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间度量,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
解析: 时间频度: T(n) 时间复杂度:O(n) T(n)的同数量级函数: f(n) n趋近于无穷大时T(n)/f(n)的极限值为不等于零的常数
推导大O阶方法 用大O阶来体现算法时间复杂度的记法,我们称之为大。记法 一般情况下,随着n的增大, T(n)增长最慢的算法为最优算法 如何推导大O阶 1·用常数1取代运行时间中的所有加法常数 2.在修改后的运行次数函数中,只保留最高阶 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数得到的结果就是大O阶
常见的时间复杂度
③最坏情况与平均情况
最坏的情况 最坏的情况运行需要的时间,没有特指如果提到运行时间就是值最坏的运行时间。
平均情况 计算所有情况的平均值 期望运行的时间
④算法的空间复杂度 定义 空间复杂度是指算法在计算机内执行时所需存储空间的度量 表示为: S(n)=O(f(n)) 我们一般所讨论的是除正常占用内存开销外的辅助存储单元规模。
4、线性表的顺序存储结构
①线性表的定义 定义 人类语言定义:零个或多个数据元素的有限序列 数学语言: 若将线性表记为(a1, ..., ai-1, ai, ai+1, ..., an),则表中ai-1领先于ai, ai+1领先于ai,称ai-1是ai的直接前驱元素, ai+1是ai的直接后继元素。当i=1, 2, ..., n-1时, ai有且仅有一个直接后继,当i=2, 3, ..., n时, ai有且仅有一个直接前驱。
分析:数据元素都是同类型的,数据元素间的关系是线性的。 注意:同一线性表中的元素必定有相同的特性。
②线性表的抽象数据结构 ADT定义 Data 线性表的数据对象集合为{a1, a2, .....an),每个元素的类型均为 DataType. 其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。 Operation InitList(L):初始化操作,建立一个空的线性表L。 ListEmpty(L):若线性表为空,返回true,否则返回false。 ClearList(L):将线性表清空。 GetElem(L, i, e):将线性表L中的第i个位置元素值返回给e。 LocateElem(L, e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功; ListInsert(L,i,e);插入新元素 ListDelete(*L,l,e);删除线性表中第i个元素 ListLength(L);返回线性表L的元素个数 endADT 注意: 对于不同的应用,线性表的操作是不同的,上述是最基本的,对于实际问 题中涉及的关于线性表的更复杂的操作。
③线性表的顺序数据结构
定义: 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线t 表的数据元素 特点:逻辑上相邻的元素,物理上也相邻
顺序存储方式 1·用一组地址连续的存储单元依次存储线性表的元素我们可以通过1维数组实现 2.代码实现:
数据长度与线性表长度的区别 数据长度:存储空间的长度,不变的 线性表长度:数据元素的个数,动态的
地址计算的方法
④顺序存储结构的插入与删除
获取元素操作 代码如下:
插入操作 演示过程 代码
Status ListInsert(SqList *L,int i,ElemTypee)
{
int k;
if (L->length==MAXSIZE) /*顺序线性表已经满*/
return ERROR;
if (i<1 ||i>L->length+1)/*当i比第一位置小或者比最后一
位置后一位置还要大时*/
return ERROR;
if (i<=L->length)/*若插入数据位置不在表尾*/
{
for(k=L->length-1;kx=i-1;k--) /* 将要插入位置之
后的数据元素向后移动一位*/
L->data[k+1]=L->data[k];
}
L->data[i-1]=e;
L->length++;/* 将新元素插入*/
return OK;
}
删除操作 代码
Status ListDelete(SqList *L,int i,ElemType *e)
{
int k;
if (L->length==0)/* 线性表为空*/
return ERROR;
if (i<1 | i>L->length)/* 删除位置不正确*/
return ERROR;
*e=L->data[i-1];
if (i<L->length) /*如果删除不是最后位置*/
{
for(k=i;k<L->length;k++)/*将删除位置后继元素前移*/
L->data[k-1]=L->data[k];
}
L->length--;
return OK;
}
线性表顺序存储的优缺点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报