cyxyrq-code-loading

 

数据结构学习1

数据结构

1、前言

为什么要学习数据结构? 数据结构: 程序=数据结构+算法 好的数据结构可以带来更高的运行或者存储效率的算法 学好“数据结构”这门课程,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程、编译原理、人工智能、游戏等都是十分有益的。

怎么学习数据结构? 数据结构: 重点:掌握每种数据结构里数据是怎么组成的,数据间的相互关系和该数据结构的特性 方法: 1,对于不理解的数据结构多画图 2.编写代码,调试,查看各种数据结构在内存中分布

数据结构的起源

“数据结构”作为一门独立的课程在国外是从1968年才开始设立的。 1968年美国高纳德·克努特(Donald Ervin Knuth)教授开创了数据结构的最 初体系,他所著的《计算机程序设计艺术》第一卷《基本算法》是第一本较 系统地阐述数据的逻辑结构和存储结构及其操作的著作。

①数据

定义: 是能被计算机识别,并输入给计算机处理的符号集合。 是描述客观事物的符号,是计算机中可以操作的对象, 举个栗子: 1.我们目标项目存储的整型,浮点型,字符串 2.其他DBMS可以存储的视频,图片 具备两个前提: 1.可以输入到计算机中 2.能被计算机程序处理

②数据元素 定义: 组成数据的,有一定意义的基本单位,在计算机中通常作为整体来处理。也被称为记录。 举个栗子: 我们目标项目数据库中一个表的一行数据(一条记录)

数据项 定义: 一个数据元素可以由若干个数据项组成。 举个栗子: 1·人这样的一个数据元素,可以有姓名,年龄,性别等数据项组成。 2·我们目标项目中数据库里一行记录中的某个字段。 注意: 数据项是数据不可分割的单位。

③数据对象 定义: 是性质相同的数据元素的集合,是数据的子集。 举个栗子: 我们目标项目中数据库里存储的一个表

④数据结构 定义: 是相互之间存在一种或多种特定关系的数据元素的集合 举个栗子: 我们目标项目中数据库里一个表的数据会被多个表用到,那么这个表和其他表是一对多的关系,也可以说是一对多的数据结构

⑤逻辑结构与物理结构

逻辑结构 1.集合结构 2.线性结构 3.树型结构 4.图形结构

物理结构 1.顺序存储结构 2.链式存储结构

 

逻辑结构 定义: 数据元素之间的逻辑关系。从逻辑关系上描述数据,与数据的存储无关。 为4类:

image-20230306221928885

物理结构 定义: 亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像), 依赖于计算机。 分为2类: 顺序存储、链式存储 举个栗子: “春夏秋冬”四个字符在计算机里的两种存储方式

image-20230306222236708

⑥数据类型 定义: 一组性质相同的值的集合及定义在此集合上的一些操作 举个栗子: 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的变化的曲线图。

image-20230307125303624

给定两个函数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)的极限值为不等于零的常数

image-20230307132026454

推导大O阶方法 用大O阶来体现算法时间复杂度的记法,我们称之为大。记法 一般情况下,随着n的增大, T(n)增长最慢的算法为最优算法 如何推导大O阶 1·用常数1取代运行时间中的所有加法常数 2.在修改后的运行次数函数中,只保留最高阶 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数得到的结果就是大O阶

常见的时间复杂度

image-20230307132942660

③最坏情况与平均情况

最坏的情况 最坏的情况运行需要的时间,没有特指如果提到运行时间就是值最坏的运行时间。

平均情况 计算所有情况的平均值 期望运行的时间

④算法的空间复杂度 定义 空间复杂度是指算法在计算机内执行时所需存储空间的度量 表示为: 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有且仅有一个直接前驱。

image-20230307145812143

image-20230307150625068

分析:数据元素都是同类型的,数据元素间的关系是线性的。 注意:同一线性表中的元素必定有相同的特性。

②线性表的抽象数据结构 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.代码实现:

#define MAXSIZE 20 /*存储空间初始分配量*/
typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */
typedef struct
ElemType data[MAXSIZE]; /* 数组,存储数据元素*/
int length; /* 线性表当前长度*/
}SqList;

数据长度与线性表长度的区别 数据长度:存储空间的长度,不变的 线性表长度:数据元素的个数,动态的

地址计算的方法 image-20230307152948062

④顺序存储结构的插入与删除

获取元素操作 代码如下:

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length==0|i<1|i>L.length)
return ERROR;
*e=L.data[i-1];

return OK;
}

插入操作 演示过程 代码

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;
}

线性表顺序存储的优缺点

image-20230307163332051

posted on 2023-07-12 16:19  清雨中欣喜  阅读(11)  评论(0编辑  收藏  举报

导航