本文共 10211 字,大约阅读时间需要 34 分钟。
数据是表征客观事物的可记录可识别的符号集合。数据是信息处理的核心基础。
本讲主要介绍了与数据结构有关的基本概念术语:
l 数据
l 数据元素
l 数据对象
l 数据类型
l 抽象数据类型
l 数据结构
数据结构是指相互之间存在一种或多种特定关系的数据元素集合。它强调的是带有结构的数据元素的集合,数据元素之间的相互关系,即数据的组织形式。数据的组织方法与效率密切相关,采用不同数据的组织方法其处理效率不同。
数据是表征客观事物的可记录可识别的符号集合。数据是信息处理的核心基础。数据结构和算法是计算机科学的基石。
【基础概念重要术语】 1、数据:描述客观事物的数值、字符以及一切能输入到计算机且能被处理的符号集合。 2、数据元素:数据元素是组成数据的基本单位,是数据集合的个体,用学籍表里的一条学生记录理解,虽然学生信息中有姓名、班级多个属性,通常作为一个整体考虑和处理,是一个数据元。 3、数据对象是性质相同的数据元素的集合,是数据集的一个子集。4、数据结构,是指相互之间存在一种或多种特定关系的数据元素集合。强调是带有结构的数据元素的集合,数据元素之间的相互关系,即数据的组织形式。如同大家熟悉的图书馆,图书馆是书的集合,但决不是书的随便堆积,而是带有索引结构的分布存放,数据结构正是注重有结构组织的数据,只有这样,才能有效支撑信息快速查找与应用服务。下面给出分别代表表、树和图基本数据结构的范例。
线性结构 树结构 图结构
学籍表 学校组织结构图 结点网络图 一对一 1对多 多对多 5、数据类型:一组性质相同的值集合以及定义其上的一组操作的集合。 6、抽象是计算机科学的本质技术。抽象数据类型ADT:就是定义在一个模型上的一组操作的集合。
其特点是抽象和隐蔽。
包括定义和实现两大方面。
定义解决服务层面功能,实现解决怎么服务的问题。
我们使用书库管理的例子来理解这个问题。
用户通过服务界面实现查书、借书和还书,用户只使用功能,具体处理过程对用户是封装的,用户也不必关心具体书在哪个书架上的具体实现问题。
1.什么是数据结构?数据结构就是带有结构的元素集合。
⒉.数据的组织方法与效率密切相关,采用不同数据的组织方法其处理效率不同 例:以电话号码查询为例:电话簿为线性表结构。可以用不同的结构组织。 如数据随机存放,结构简单但只能顺序查找效率低。如采用索引按姓氏排序,就能快速查找。 对具体问题找出适合的数据组织方法将事半功倍。由此可见数据结构的作用。1.一个抽象类型包括数据对象、 和一组处理数据的操作。
A.数据对象中各元素间的结构关系
B.数据元素集
C.接口
D.数据对象集
2.抽象数据类型具有 、信息隐蔽的特点。
答案:1.A 2.数据抽象
本讲介绍数据结构的内容,即数据结构研究范围:逻辑结构、存储结构、运算集合。 数据结构注重的是数据元素之间的相互关系。
数据元素的相互关系表示为数据元素间的逻辑关系即逻辑结构。数据元素之间存在四种基本的逻辑结构:
(1)集合结构(2)线性结构(3)树形结构(4)图形结构。
存储结构:是逻辑结构在计算机中的存储映象,也是在计算机中的实现。数据元素之间关系在计算机中的表示方法分为:
顺序映象(顺序存储结构,如数组,就是一组连续配置的单元);
非顺序映象(非顺序存储结构,如链表,是一组任意配置的单元,通过指针连接起来,维持逻辑关系。
数据结构的内容,即数据结构研究范围;数据结构注重的是数据元素之间的相互关系。数据结构的内容包括数据结构的逻辑结构和数据结构的存储结构及运算集合。
数据元素之间存在四种基本的逻辑结构:
(1)、集合结构:集合是属于与不属于简单的关系,在此就不讨论.
(2)、线性结构:结构中的数据元素之间存在着一对一的线性关系:如线性表(学籍表)
(3)、树形结构:结构中的数据元素之间存在着一对多的层次关系:如树(学校组织结构图>
(4)、图形结构:结构中的数据元素之间存在着多对多的任意关系:如图(网络节点图)
综上所述,数据的逻辑结构可概括为:
是逻辑结构在计算机中的存储映象,也是在计算机中的实现。
逻辑结构和存储结构之间的关系:存储结构是逻辑关系的映象。
逻辑结构是数据结构的抽象,存储结构是数据结构的实现,两者综合起来建立了数据元素之间的结构关系。
数据元素之间关系在计算机中的存储映像分为:
定义在数据集及数据元素关系集上的运算操作集合,
通过工资表实例对数据结构内容作一概括,工资表可以采用顺序表存放,也可采用链表存放;
当调入职工时做插入操作、调离职工做删除操作、调整工资时做更新操作,即:常用的增删改等运算的集合。
按照一定的逻辑关系组织起来的一批数据,按一定的映像方式存放在计算机中,并在其上定义运算集合,就构成数据结构内容的三要素。
(1)注重掌握四种逻辑结构
四种逻辑结构中除了集合关系只有属于关系外,线性结构关系为一对一,树结构关系为一对多,图结构关系为多对多
(2)两类存储结构:
顺序结构:一组连续单元
非顺序结构:一组任意存储单元
线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。( )
×
数据结构的逻辑结构分为集合、线性、层次和 四种。
网状
数据结构的存储结构分为 和非顺序 两种。
顺序
在线性结构、树形结构和图结构中,数据元素之间分别存在着一对一、一对多和 联系。
多对多
本讲主要介绍:
数据结构与程序设计的关联性。强调良好的数据结构可以提高程序效率。
结构化程序设计与函数的模块化。
用C语言实现抽象数据模型。用C语言实现抽象数据模型一方面需要使用typedef定义新的结构体类型,另一方面对于每一个数据操作使用一个函数来实现。
算法描述规范与设计风格:函数参数传递相关技术。
良好的数据结构可以提高程序的效率。
问题描述欲求1名学生10次C语言程序设计的测试成绩总分与平均分。
其中10次测验的成绩分别为:80,85,77,56,68,83,90,92,80,98。
程序示例1-1
#include要用该程序计算另一名学生的10次成绩就得修改程序;如考试测验次数改变也要修改程序,程序扩充性与通用性较差。程序示例1-2 根据测试次数与测试成绩的关系,采用数组结构存储测验成绩,提高了程序的适用范围。int main(){ int sum,average; /*总分,平均分*/ int t1,t2,t3,t4,t5,t6,t7,t8,t9,t10; /*10个变量存10 次成绩*/ t1 = 80; t2 = 85; t3 = 77; t4 = 56; t5 = 68; /*分别赋值*/ t6 = 83; t7 = 90; t8 = 92; t9 = 80; t10 = 98; sum = t1 + t2 + t3 + t4 + t5 + t6 + t7 + t8 + t9 + t10; /*计算总分*/ average = sum / 10; /*计算平均分*/ printf("总分 = %d\n",sum); printf("平均分= %d\n" , average); return 0;}
#include分析以上两个程序,虽然都可以正确解决问题,但采用不同的方式存储成绩数据,可以生成不同的程序设计方式。因此,选择最佳的数据结构,并提供策略方法有效地利用这些数据,可以达到高效、低耗地解决问题。学习数据结构正是要学习前人程序设计的学问。int main(){ int sum,average; int i; int t[10] = {80,85,77,56,68,83,90,92,80,98};/*分别赋值*/ sum = 0; /*总分置初值*/ for (i = 0; i < 10; i++) sum = sum + t[i]; average = sum / 10; /*产计算平均分 */ printf("总分 = % d\n",sum); printf("平均分=%d\n", average); return 0;}
结构化程序设计是一套规范程序设计方法,它采用合理的结构以确保程序的正确执行。结构化程序设计由顺序结构、选择结构和重复结构构成。此外需要注意:应该尽可能少的使用GOTO语句,因为GOTO语句会使程序的静态结构与动态执行不一致。
结构化程序设计的主要思想是“自顶向下,逐步求精”,每一个模块具有独立的功能,设计过程中仅使用三种基本结构。抽象数据模型是由数据对象、结构关系和数据操作构成的。课件中以线性表的抽象数据类型为例子。数据对象的定义可以使用现有的数据类型或者自定义的数据类型。
用C语言实现抽象数据模型一方面需要使用typedef定义新的结构体类型,另一方面对于每一个数据操作使用一个函数来实现。算法的规范描述方法是使用C中函数定义形式,每一个函数可以实现特定的功能。
算法描述要点有很多,比如必须对相关的功能、参数增加必要的注释以增强可读性。在函数调用中可使用单向值传递或地址传递
提升程序设计基础,提高算法设计能力
①选择适合问题表示的结构,提高算法效率
②掌握模块化设计方法,用C函数定义算法功能
③用C实现抽象数据类型ADT,包括对象、关系、操作三部分,明确类型定义与变量定义的关系自定义类型定义了一种规格,变量是规格的具体空间。
④运用语言基础,掌握函数的定义与使用,注释功能服务,明确函数参数传递接口,注重算法设计风格。
当需要用一个形式参数直接改变对应实参的值时,该形式参数应说明为 。
A.与实参同类型指针参数
B.不需要参数
C.与实参同类型的参数
D.全局变量
A
本讲学习算法性能评价方法及性能评价指标。
算法性能评价指标算法的执行时间和占用空间两个方面。通过引入问题规模、语句频度等概念,得到算法时空性能评价指标:算法的时间复杂度和算法的空间复杂度;并通过实例介绍算法的时间复杂度和空间复杂度的计算方法,从而得到算法的时空性能评价结果。
有了解决问题的算法,如何评价解决同一问题不同算法的性能优劣?其标准涉及算法的执行时间和占用空间两个方面。
应是问题规模的函数,以刻画表征问题规模的大小。
对于不同的问题其含义不同:如矩阵的阶、多项式的项数、图的顶点数、集合的个数等,是反映问题大小的本质数目。
算法实际执行时间与机器硬件和软件环境相关(比如两个机器的性能指标不同,就不便比较算法执行的快慢),
舍弃机器环境差异影响,语句执行时间本质就是语句执行次数,与机器环境无关。因此算法的执行时间就是算法所有语句的执行次数之和。例如:求两个n阶方阵的乘积c=a×b。
# define n 100/*n 可根据需要定义,这里假定为100*/void MatrixMulti(int a[n][n],int b [n][n],int c[n][n]){ 该算法每一语句的语句频度为(1)for (i = 0; i < n; i++) n + 1(2)for (j = 0; j < n; j++) n(n + 1)(3){c[i][j] = O; n^2(4)for (k = 0; k < n; k++) n^2(n + 1)c[i][j] = c[i][j] + a[i][k] * b[k][j]; n^3}}
分析:语句(1)的循环控制变量i从o增加到n,测试到 i=n成立才会终止,故它的频度是n+1,但是它的循环体却只能执行n次。
语句(⑵)作为语句(1)循环体内的语句应该执行n次,但语句(⑵)本身要执行n+1次,所以语句⑵的频度是n(n+1)o
同理可得语句(3),(4)和(5)的频度分别是n^2,n^2(n+1)和 n^3。
该算法中所有语句的频度之和(即算法的时间耗费)为: f(n)=2n^3+3n^2+2n+1 该算法的时间耗费是矩阵阶数n 的函数。一个算法的时间复杂度T(n)是该算法的时间度量,计作:T(n)=O(f(n))
它表示随问题规模n的增大,算法的执行时间的增长率和 f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。数据结构中常用的时间复杂度频率计数有7个:
按时间复杂度由小到大递增排列成表1-3(当n充分大时)。
不同数量级的时间复杂度的形状如图1.6所示,表1-3与图1.6是同一问题的不同表示形式。
一般情况下,随n的增大,T(n)的增长较慢的算法为最优的算法。从中我们应该选择使用多项式阶o(nk)的算法,而避免使用指数阶的算法。
由图1.8可知,随着问题规模n的增大,算法A所耗费的时间o(log2n)的增大趋于平缓,算法B所耗费的时间复杂度迅速增大。显然在同一个问题解决方案中,算法A的运行效率高,可认为算法A优于算法B。
数据结构常用时间复杂度有7种,分析按大小排列的频度表,前3种增加速度平缓,后3种增加速度过快,随着N的增大实现困难。
是指执行基本操作的最大次数。基本操作时指算法中基本运算的操作。
例如,在数值 A[0..n-1]中查找给定值K的算法大致如下:(1)i=n-1;
(2)while(i>=0&&(A[i]!=k))
(3)i--;
(4)return i;
给出算法分析:查找成功时,
最坏情况是从A中最后一直找到第一个元素,共查找n次,最好情况是最后一个元素就是K,只查找一次 查找失败会查n+1次,查完都找不到 因此算法最坏时间复杂度就取了最多次数上界为o(n)类似于时间复杂度的讨论,一个算法的空间复杂度S(n)定义为该算法所耗费的存储空间的数量级,它也是问题规模n 的函数。记做:s(n)=O(f (n))
一般情况下,一个程序在机器上执行时,除了需要寄存本身所用的指令、常数、变量和输入数据以外,还需要一些对数据进行操作的辅助存储空间。其中对于输入数据所占的具体存储量只取决于问题本身,与算法无关,这样我们只需要分析该算法在实现时所需要的辅助空间单元个数就可以了。若算法执行时所需要的辅助空间相对于输入数据量而言是个常数,则称这个算法为原地工作,辅助空间为o(1)。 例如,将一维数组a中的n个数据逆序存放到原数组中,下面是实现该问题的两种算法:算法1:
for (i=0;i<n;i++)
b[i]=a[n-i-1];for (i=0;i<n;i++)
a[i]=b[i]; 算法2:for (i=o;i<n/2;i++)
t=a[i]; a[i]=a[n-i-1];a[n-i-1]=t;
} 算法1的空间复杂度为O(n),需要一个大小为n的数组b。 算法2的空间复杂度为o(1),需要一个变量t,与问题规模没有关系。算法的时间复杂度和空间复杂度合称为算法的复杂度。 【本节要点】 1、语句频度的概念与计算2、算法时间复杂度计算
3、算法空间复杂度计算
执行下面的程序段的时间复杂度为 。for(int i=0;i
A.O()
B.O()
C.O(m*n)
D.O (m+n)
C
2、执行下面程序段时,语句S的执行次数为 。
for(int i=0;i<=n;i++) for(int j=0;j
B.
C.n(n+1)
D.
D
本讲主要介绍:
n算法的定义
n算法的特性
n算法设计的要求
n算法描述的工具
算法是规则的有限集合,是为解决特定问题而规定的一系列操作。也就是说算法是处理步骤的序列集合。
有限性、确定性、可行性和输入输出特性。
算法需要保证正确性、可读性、健壮性和高效率低存储量等问题。
算法的正确性是不言而喻的,正确可分为三个层次:
1、一般数据能得出要求结果;
2、精心选择的边界数据也能得到要求结果;
3、所有合法数据都能得到要求结果。一层比一层要求更高。例:要求n个数的最大值问题,给出示意算法如下:
max = 0;for (i = 1; i = n; i++){ scanf("%f", &x); if (x > max) max = x;}
求最大值的算法无语法错误;
当输入的n个数全为正数时,结果正确,
如果输的入n个数全为负数时,求得的最大值为o,显然这个结果不对,由这个简单的例子可以说明算法正确性的内涵。
下面例子是n个数中求最大值算法的核心语句。分析算法正确性是第几层次?
描述算法的工具可有多种,可用自然语言、框图或高级语言实现。自然语言简单但容易二意表达,框图易于表达处理流程而难于表达数据流程,高级语言准确但细节过多。
因此我们选择用接近于高级语言而不是高级语言的类语言来表达。其优势为具有一般的语言规则而舍弃语言细节,把注意力集中于算法处理步骤本身。
用if then结构大家都能理解,那就是如果满足条件则执行。
算法设计的要求是:正确性、可读性 、 和高效率和低存储 。
A.确定性
B.健壮性
C.可行性
D.有限性
B
算法具有 有限性、确定性、 、输入、输出五大特性。
A.可行性
B.可读性
C.健壮性
D.正确性
A
本讲从以下三方面:
掌握数据结构的基本概念
逻辑结构与存储结构的区别
算法与算法分析
对本章内容进行概括总结。
【掌握数据结构的基本概念】
数据结构包括数据的逻辑结构、存储结构和运算集合这三个部分。理解什么是数据类型、抽象数据类型、数据抽象和信息隐蔽规则。了解什么是面向对象。
【算法与算法分析】理解算法的定义、算法的特性、算法的时间代价、算法的空间代价。
1单选(5分)算法的时间复杂度与( )有关。
A.编译程序质量
B.计算机硬件性能
C.程序设计语言
D.问题规模
2单选(5分)算法分析的主要任务是分析( )。
A.算法是否具有较好的可读性
B.算法的执行时间与所需空间与问题规模的关系
C.算法的功能是否符合要求
D.算法中是否存在语法错误
3单选(5分)算法分析的目的是( )。
A.分析算法的效率以求改进
B.分析算法的可读性
C.找出数据结构的合理性
D.研究算法中输入和输出的关系
4单选(5分)数据的最小单位是( )。
A.数据项
B.数据变量
C.数据元素
D.数据类型
5单选(5分)某算法的时间复杂度是O(n*n),表明该算法的( )。
A.执行时间等于n*n
B.执行时间与n*n正比
C.问题规模与n*n正比
D.问题规模是n*n
6单选(5分)如下程序段:
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
x=x+1;
其中语句x=x+1执行的语句频度为( )。
A.n*(n+1)/2
B.n*n
C.n*(n-1)
D.n*(n-1)/2
7单选(5分)在数组A[0..n-1]中查找给定值K的算法大致如下:
i=n-1;
while(i>=0 && (A[i]!=k))
i--;
return i;
该算法的时间复杂度为( )。
A.无法确定
B.O(n-i)
C.O(n-i+1)
D.O(n)
8单选(5分)下面算法的时间复杂度为( )。
x=100; y=100;
while(y>0)
if(x>100)
{x=x-10; y--;}
else
x++;
A.O(n)
B.O(n*n)
C.O(1)
D.O(100)
9单选(5分)下面的算法是判断n是否为素数,其时间复杂度为( )。
void prime(int n)
{
for (i=2; i<sqrt(n) && (n % i)!=0; i++) ;
if (i>sqrt(n))
printf("%d is a prime number", n);
else
printf("%d is not a prime number", n);
}
A.O(n)
B.O(sqrt(n)) sqrt表示对n取根方
C.O(n-i)
D.O(1)
10单选(5分)某算法中,执行频率最高的语句的语句拼读为
则该算法的时间复杂度应该是( )。
A.T(n) = O(n*n*n)
B.T(n) = O(n*n+n)
C.T(n) = O( (n*n*n+n*n+n)/n )
D.T(n) = O(n*n)
11多选(5分)以下属于数据元素间基本逻辑结构的是( )。
A.树
B.图
C.线性
D.集合
12多选(5分)以下属于算法特性的是( )。
A.0个或多个输入;至少一个输出
B.正确性
C.可行性和有限性
D.确定性
13多选(5分)算法设计的要求包括( )。
A.高效率和低存储
B.健壮性
C.正确性
D.可读性
14多选(5分)
数据元素在计算机内存中的存储映像包括( )。
A.图结构
B.顺序存储
C.非顺序存储
D.树结构
15多选(5分)
抽象数据类型包括了( )。
A.一个数据对象
B.元素的存储结构
C.一组操作
D.元素间的关系
16
判断(5分)
线性结构只能用顺序存储结构来存放,非线性结构只能用非顺序存储结构来存放。
A.×
B.✓
17
判断(5分)
算法就是程序。
A.×
B.✓
18
判断(5分)
算法的优劣与算法描述的语言无关。
A.×
B.✓
19
判断(5分)
算法的可行性是指每一条指令具有明确含义。
A.×
B.✓
20
判断(5分)
健壮的算法不会因为非法输入数据而出现莫名的执行结果。
A.×
B.✓
21
判断(5分)
算法设计的要求就是要设计高效率和低存储的算法。
A.×
B.✓
22
判断(5分)
数据类型就是变量。
A.×
B.✓
23
判断(5分)
数据结构的存储结构分为顺序存储和非顺序存储。
A.×
B.✓
24
判断(5分)
数据结构的顺序存储优于非顺序存储。
A.×
B.✓
25
判断(5分)
元素间的逻辑关系可分为线性和非线性关系两种。
A.×
B.✓
26单选(5分)
以下算法的时间复杂度为( )。
if (n >= 0)
{
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
printf("输入数据大于等于零\n");
}
else
{
for(int j = 0; j < n; j++)
printf("输入数据小于零\n");
}
A.O(n*n+n)
B.O(n)
C.O(1)
D.O(n*n)
转载地址:http://oqzkk.baihongyu.com/