数据结构—绪论

数据结构 ——绪论

数据结构指的是“一组数据的存储结构”,是数据之间存在一种或多种特定关系的数据元素的集合,为编写出一个“好”的程序,必须分析待处理对象之间存在的关系这也就是研究数据结构的意义所在。
数据结构 是相互之间存在的一种或多种特定关系的数据元素的集合。在任何问题中,数据元素都不是孤立存在的,它们之间存在某种关系,这种数据元素之间的关系称为结构。数据结构包括三方面的内容:逻辑结构、存储结构和数据的运算。
数据的逻辑结构和存储结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。

在这里插入图片描述

一、数据结构的基本概念与术语

数据 :信息的载体,是描述客观事物属性的数、字符、及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。
数据元素 :数据元素是数据的基本单位,一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。
例:学生(学号,姓名,性别)
数据对象 :是具有相同性质的数据元素的集合,是数据的一个子集。
数据类型: 数据类型是一个值的集合和定义在此集合上的一组操作的总称。
1)原子类型 其值不可再分的数据类型。
2)结构类型 其值可以再分解为若干成分(分量)的数据类型。
3)抽象数据类型 抽象数据组织及与之相关的操作。

数据结构三要素
1.数据的逻辑结构
逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算的。数据的逻辑结构分为线性结构和非线性结构。
线性结构:线性表、栈、队列串、数组
非线性结构:树、图
2.数据的存储结构
存储结构是指数据结构在计算机中的表示(又称映像),也称物理结构。它包括数据元素的表示和关系的表示。数据的存储结构是用计算机语言实现的逻辑结构。它依赖于计算机语言,数据的存储结构主要有顺序存储、链接存储、索引存储和散列存储。

1)顺序存储。
把逻辑上相邻的元素存储在物理位置也上相邻的存储单元中,元素之间的关系由存储的单元的邻接关系来体现。优点:可以随机存取,每个元素占用最少的存储空间;缺点是只是使用相邻的一整块存储 单元,因此可能差生较多的外部碎片。
2)链式存储。
不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。其优点是不会出现碎片现象,能充分利用所有存储单元;缺点是每个元素因存储指针而占用额外的存储空间,且只能实现顺序存储。
3)索引存储。
在存储索引元素信息的同时,还建立附加索引表。索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。其优点是检索速度快;缺点是附加的索引表额外占用存储空间。另外,增加和删除数据时也要修改索引表,因此会花费较多的时间。
4)散列存储。
根据元素的关键字直接计算出该元素的存储地址,缺点是若散列函数不好,则可能出现元素存储单元冲突,而解决冲突会增加时间和空间开销。

数据的运算
施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能,运算的实现是针对存储结构的,指出运算的具体操作步骤。

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

抽象数据类型简称ADT,是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而在与其在计算机内部如何表示与实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部的使用。
抽象数据类型的定义由一个值域和定义在该值域上的一组操作完成。
抽象数据类型可以通过固有数据类型来表示和实现,即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组
合新的操作。
抽象数据类型可用三元组表示
(D,S,P)其中D是数据对象,S是D上的基本操作集,P是对D的基本操作集。
ADT抽象数据名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT抽象数据类型名
其中数据对象和数据关系的定义用伪代码描述,基本操作的定义格式为
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
基本操作有两种参数:赋值参数只为操作提供输入值;引用参数以&打头,除可提供输入值外,还将返回操作结果。"初始条件"描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。"操作结果"说明了操作正常完成之后,数据结构的变化状况和应返回的结果。若初始条件为空,则省略之。

(1)预定义常量和类型

//函数结果状态码
# define TRUE 1
# define FALSE 0
# define  ok 1
# define ERROR 0
# define INFEASIBLE -1
# define OVERFLOW -2
// Status 是函数的类型,其值是函数结果状态码
typedef int Status 

(2)数据结构的表示(存储结构)用类型定义(typedef)描述。数据元素类型约定为ElemType。由用户在使用该数据类型时进行定义。

(3)基本操作的算法都用以下形式的函数描述

函数类型 函数名(函数参数表){
//算法说明
语句序列
}//函数名

除了函数的参数需要说明类型外,算法中使用的辅助变量可以不作变量说明,必要时给予注释。当函数返回值为函数结果状态码时,函数定义为Status类型。为了便于算法描述,除了值调用方式外,增添了C++语言的引用调用的参数传递方式。在形参表中,以&打头的参数即为引用参数。

(4)赋值语句

简单赋值 变量名=表达式;
串联赋值 变量名1 =变量名2==变量名k=表达式;
成组赋值(变量名1,…,变量名k)=(表达式1,…,表达式K);
         结构名=结构名;
         结构名=(值1,…,值k);
         变量名[]=表达式;
交换赋值 变量名<————>变量名;
条件赋值 变量名=条件表达式?表达式T:表达式F;

(5)选择语句

条件语句1 if(表达式)语句;
条件语句2 if(表达式)语句;
		else语句;
开关语句 1 switch(表达式){
		case1;语句序列1break;
		……
		case 值n;语序序列n;breakdefault;语句序列n+1}
开关语句2 switch{
       case 条件1;语句序列1break;
       ……
       case条件n;语序序列n;break;
       default;语句序列n+1}

(6)循环语句

for语句 for(赋初值表达式序列;条件;修改表达式序列)语句;
while语句 while(条件)语句;
dowhile语句 do{
			语句序列;
			}while(条件);

(7)结束语句

函数结束语句 return表达式 returncase结束语句 break;
一场结束语句 exit(异常代码);

(8)输入和输出语句

输入语句 scanf([格式串],变量1,…,变量n);
输出语句 printf([格式串],表达式1,…,表达式n);
通常省略格式串

(9)注释

单行注释 //文字序列

(10)基本函数

求最大值 max(表达式1,…,表达式n)
求最小值 min(表达式1,…,表达式n)
求绝对值 abs(表达式)
求不足整数 floor(表达式)
求进位整数值 ceil(表达式)
判定文件结束 eof(文件变量)
判定行结束  eoln(文件变量)

(11)逻辑运算约定

与运算&&;对于A&&B,当A的值为0时,不再对B求值
或运算||;对于A||B,当A的值为非0时,不再对B求值

三、算法与算法分析

算法是指对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。

算法的特性:
(1) 有穷性 ,一个算法必须总是再执行有穷步之后结束,且每一步都可再有穷时间内完成。
(2)确定性,算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。并且,在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的输出。
(3)可行性,一算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。
(4)输入,一个算法有零个或多个输入,这些输入取自某个特定的对象的集合。
(5)输出,一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量。
算法设计的要求:
正确性、可读性、健壮性、效率与低存储量需求。

算法效率的度量
1.时间复杂度
一个语句的频度是指该语句在算法中被重复执行的次数,算法的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)数量级。
最内层语句的执行次数
平均时间复杂度是指所有可能输入实例在等概率出现的情况下,算法的期望运行时间。最好时间复杂度是指在最好情况下,算法的时间复杂度。
一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。在分析一个程序的时间复杂性时,有以下两条规则:
a )加法规则
T ( n )= T ( n )+T2( n )= O ( A ( n ))+ O ( g ( n ))= O ( max (/( n ), g ( n )))
b )乘法规则
T ( n )= T ( n )xT2( n )= O ( f ( n )) xO ( g ( n ))= O ( f ( n ) xg ( n ))
常见的渐近时间复杂度为
0(1)< O (log2n)< O ( n )< O ( nlog2n )< O (n2)< O (n3)< O (2")< O ( n !)< O ( n ")

2.空间复杂度
算法的空间复杂度 S ( n )定义为该算法所耗费的存储空间,它是问题规模 n 的函数。记为
S ( n )= O ( g ( n ))
一个程序在执行时除需要存储空间来存放本身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。若输入数据所占空间只取决于问题本身,和算法无关,则只需分析除输入和程序之外的额外空间。
算法原地工作是指算法所需的辅助空间为常量,即0(1)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值