数据结构 第一章 绪论.docx
《数据结构 第一章 绪论.docx》由会员分享,可在线阅读,更多相关《数据结构 第一章 绪论.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构第一章绪论
数据结构
第一章绪论
课程介绍:
1、计算机应用技术专业的核心课程;
数据结构是计算机科学与技术专业的一门专业技术基础课。
该课程是计算机科学的算法理论基础和软件设计的技术基础,主要研究信息的逻辑结构及其基本操作在计算机中的表示和实现。
2、应用软件开发必备理论知识;
1)人机对弈树形结构
2)如何实现打印时次序不乱队列
3)汉字输入时如何使常用字排在前面查找方法
4)图书馆书目检索线性表
5)城市的交通布线及信号灯的显示图
……
本课程是一门综合理论课程,理论性比较强,比较抽象,同时也比较枯燥。
教学上主要采用课堂讲授的方式来学习,为了激发同学的学习兴趣,同时也采用游戏式、启发式、讨论式、自主式多种教学方法相辅。
希望同学们能积极主动的参与进来,使我们的课堂变得生动活泼。
学习目标:
❑了解数据结构的有关概念
❑掌握逻辑数据结构
❑线性表
❑树
❑图
❑熟悉常用查找方法原理及使用方法
❑熟悉常用排序方法原理及使用方法
❑掌握常用算法
❑1.1什么是数据结构
❑1.2基本概念和术语
❑1.3抽象数据类型的表示和实现
❑1.4算法和算法分析
1.1什么是数据结构
一般来说,用计算机解决一个具体问题时,大致需要经过下列几个步骤:
具体问题→数学模型→算法→程序
例子:
❑图书馆的书目检索系统
❑人机对弈问题
❑交通灯的管理
例1书目自动检索系统
例2人机对奕问题
例3多叉路口交通灯管理问题
例4城市间的通信布线问题
数据结构定义:
是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等等的学科。
1.2基本概念和术语
✧数据是对客观事物的符号表示,在计算机科学中是指所有能输入计算机并能被计算机处理的符号的总称。
✧数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
例如一个棋盘格局、一个城市结点、线性表中一条记录等。
一个数据元素是由若干个数据项组成的。
✧数据项是数据元素的详细描述,是数据处理中不可分割的最小单位。
✧数据对象是具有相同性质的数据元素的集合。
✧数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
✧在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构。
根据数据元素之间的不同特性,通常有下列四类基本结构:
1.集合:
集合结构中的所有元素都“属于同一集合”,即只要满足同属于一个集合就是集合结构,这是一种极为松散的结构。
2.线性结构:
该结构的数据元素之间存在着一对一关系。
3.树形结构:
该结构的数据元素之间存在着一对多关系。
4.图形结构:
该结构的数据元素之间存在着多对多的关系,图形结构也称为网状结构。
基本结构图例:
1.线形结构:
元素关系为“一对一”
2.树形结构:
元素关系为“一对多”
3.图状结构:
元素关系为“多对多”
4.集合结构:
元素关系为“同属于”
思考:
对四种基本结构分别举出例子
大街上熙熙攘攘的人群是“集合”
火车站上排队买票的长龙是“线性结构”
四世同堂的大家族是“树形结构”
济南一日游线路是“图结构”
示例:
❑linear=(D,R)
❑D={1,2,3,4,5,6,7,8,9}
❑R={<1,2>,<2,3>,<3,4>,<4,5>,<5,6>,<6,7>,<7,8>,<8,9>}
❑逻辑图为:
示例:
❑tree=(D,R)
❑D={a,b,c,d,e,f,g,h,i,j,k,l}
❑R={(a,b),(a,c),(a,d),(b,e),(b,f),(b,g),(c,h),(c,i),(c,j),(d,k),(d,l)}
❑逻辑图为:
习题:
设数据元素的集合为D={d1,d2,d3,d4,d5},画出各关系R对应的数据结构B=(D,R)的图形,并判断其所属逻辑结构的类型?
⑴R={(d1,d2),(d2,d4),(d1,d3),(d2,d5)}
⑵R={(d5,d4),(d4,d3),(d3,d1),(d1,d2)}
⑶R={(di,dj)|i数据结构分类:
✧数据结构包括数据的逻辑结构和数据的物理结构。
✧从实际问题中抽象出来的数学模型,结构中的“关系”描述的是数据元素之间的逻辑关系,因此又称为数据的逻辑结构。
✧集合、线性结构、树、图
✧数据结构在计算机中的表示(又称映像)称为数据的物理结构,或称存储结构。
✧数据元素之间的关系在计算机中的表示方法(数据的物理结构)有两种:
顺序存储结构和链式存储结构。
数据结构的逻辑结构分类
数据结构的物理结构分类
数据类型:
数据类型是一个值的集合和定义在这个值的集合上的一组操作的总称。
数据类型分为两类
1、原子类型
基本数据类型有:
✧整型(int):
存储整型量,如123,-7
✧浮点型(float):
表示实型数据(带有小数点),如3.14159等
✧字符型(char):
表示单个字符,如‘a’
2、结构类型,如数组、结构体。
✧数组:
用于保存一批相同类型的数据;
✧结构体(structure)是一种数据类型,它把互相联系的数据组合成一个整体。
例:
1.3抽象数据类型的表示与实现
抽象数据类型:
❑抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作。
抽象数据类型的定义取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部的使用。
❑本书中所定义的抽象数据类型,既可以是整型、实型、字符型或某种结构体类型,具体使用时只需将它重新定义一下即可。
抽象数据类型可以用三元组表示:
ADT=(D,S,P)其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。
1.4算法和算法分析
算法(algorithm)解决某一特定问题的具体步骤的描述,是指令的有限序列,其中每个指令表示一个或多个操作。
算法的特性
✓有穷性:
一条指令都只能执行有限次,算法必须在执行有限步后结束
✓确定性:
算法中每条指令的含义必须明确,不允许有二义性
✓可行性:
算法应该在有限时间内执行完毕
✓输入:
算法开始前必须给算法中用到的变量赋初值,即算法的输入可包含零个数据或多个数据(也称为输入数据),这些输入数据取自确定的对象集合
✓输出:
算法有一个或多个输出
算法设计的要求
1.正确性
2.可读性
3.健壮性
4.效率与低存储量需求
算法效率的度量:
时间复杂度和空间复杂度
•设:
执行每条语句所需时间为单位时间,则:
算法耗费时间=基本语句的重复执行的次数之和。
例1:
NXN矩阵相乘
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{c[i][j]=0;
for(k=1;k<=n;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
1.{++x;s=0}
2.For(i=1;i<=n;++i){++x;s+=x}
3.For(j=1;j<=n;++j)
for(k=1;k<=n;++k){++x;s+=x;}
O
(1)、O(n)、O(n2)
练习:
For(i=2;i<=n;++i)
for(j=2;j<=i-1;++j)
{++x;a[i][j]=x}
❑结论:
忽略了细微部分,只考虑最高次。
一个算法的空间复杂度是指程序运行开始到结束所需的存储空间。
记作:
S(n)=O(f(n))
测验:
✧列举数据结构的逻辑结构分类
✧列举数据结构的物理结构分类
✧画出下列二元组对应的图形,并判断其所属逻辑结构的类型
⏹B=(D,R)
⏹D={d1,d2,d3,d4,d5}
⏹R={(d5,d4),(d4,d3),(d3,d1),(d1,d2)}
1.抽象数据类型的定义由哪几部分组成?
数据对象、数据关系和基本操作三部分。
2.按数据元素之间的逻辑关系不同,数据结构有哪几类?
线性结构、树型结构、图状结构和集合四类。
3.你能举出几个你熟悉的"序列"的例子来吗?
如:
"0,1,2,…,9","A,B,C,…,Z"。
补充内容:
❑数组
❑指针
❑结构体
数组:
❑数组:
用于保存一批相同类型的数据;
❑数组名:
一批同类型数据共有的名字;
❑下标:
数组中的各个数据用下标来区分;
一维数组:
1.一维数组的一般形式:
类型说明符数组名[常量表达式]
如:
floatscore[30];
float是类型说明符,定义该数组中元素的类型。
score是数组名,是这一组数据共有的名字;
30是常量表达式,表示数组的长度,即元素的个数。
也就是说:
数组score可以保存30个float型的数据。
Ø常量:
在程序运行过程中其值不能改变的量。
Ø变量:
程序在运行时其值可改变的量。
2.一维数组元素的引用:
数组名[下标]
如:
a[i]是数组a中下标为i的数组元素;
a[0]是下标为0的数组元素。
ØC语言规定:
数组元素的下标从0开始。
Ø如数组a[50]包含50个数组元素,分别是:
⏹a[0]a[1]a[2]……a[49]
即不存在数组元素a[50]。
3.数组初始化:
Ø定义数组时对数组元素赋予初值;
如:
inta[6]={0,1,2,3,4,5};
Ø对全部元素赋初值时,可不指定数组长度;
如:
inta[]={0,1,2,3,4,5};
Ø若只给部分元素赋初值,长度不能省略;
如:
inta[6]={0,1,2};
指针:
1.理解数据在内存中的存储;
如:
inta,b;
a=30;b=40;
1.内存变量的访问方式:
1.直接访问:
按变量地址存取变量值;
2.间接访问:
将变量地址放在另一变量(专门存放地址)中;如p1=&a;
2.指针的概念:
1.指针---指针就是一个变量的地址;
2.指针变量---专门存放另一变量的地址的变量;
指针变量的定义:
1.指针变量的定义
v格式:
类型标识符*指针变量名
v说明:
✓类型标识符规定该指针变量指向变量的类型;
✓*表示该变量为指针变量。
2.指针变量的引用
❑运算符:
&--取地址运算符如&a—变量a的地址;
*--取内容运算符如*p1—p1指向变量的内容;
❑如果定义:
inti;int*p;p=&i;
表示把变量i的地址赋给指针变量p;
即指针变量p指向变量i;
*p表示变量i的值;
指针变量与数组
❑指针可以指向数组和数组元素
❑当一个指针指向数组后,对数组元素的访问,既可以使用数组下标,也可以使用指针。
指向数组元素的指针变量
❑指向数组元素的指针变量,其类型应与数组元素相同。
如:
inta[10];
floatb[10];
int*p;
float*pf;
❑为让指针变量p指向数组a,应把数组a的起始地址赋给p。
有两种方法:
1.p=&a[0];
2.p=a;/*把数组a的起始地址赋给p*/
通过指针引用数组元素
如果指针p指向数组a,则:
•p+1指向下一个元素a[1]
•p+i指向元素a[i]
结构类型:
结构类型是若干个类型相同或不同数据项的集合。
定义一个结构类型的一般形式为:
Struct结构类型名
{数据类型数据项1;
数据类型数据项2;
……
数据类型数据项n;
}
structstudent
{int num; /*学号*/
char name[20]; /*姓名*/
char sex; /*性别*/
int age; /*年龄*/
float score; /*成绩*/
char addr[30]; /*地址*/
};
其中struct是关键字,student是定义的结构体类型名。
结构体中的每一项数据,称为结构体“成员”。
结构类型的特点:
❑它有若干个数据项组成,每一个数据项属于一种数据类型。
每一个数据项称为一个结构体的成员。
❑结构类型只是定义了一个类型,而不是定义变量。
定义一个类型只是表示这个类型的结构,即告诉系统它有哪些类型的成员组成,并把它们当作一个整体来处理。
结构类型:
结构变量的引用:
❑普通变量:
结构变量名.成员名
❑指针变量:
结构指针变量名->成员名
Structstudent
{charno[15];
charname[15];
intage;
}stu1,
其中Structstudent是结构体类型标识符,stu1是结构体变量名。
Stu1.age=18;
Stu1->age=20;