260 likes | 357 Views
第一章 绪论. 学习要点: ● 数据、数据元素和数据项基本概念。 ● 数据类型和抽象数据类型基本概念及其联系与区别。 ● 数据结构基本概念,数据逻辑结构的四种基本类型,数据存储结构两种基本类型。 ● 理解数据存储结构除了存储数据元素本身,更重要的是要存储数据元素之间关系。 ● 算法基本概念与特性,如何评价算法的效率。 ● 认识和理解数据结构在计算机学科中的地位与意义。. 1.1 数据. 1.1.1 数据基本概念 数据是对客观事物的描述,是信息的载体,是能够被计算机识别、存储和加工处理的各种形式的总和。 1.1.2 数值型与非数值型数据
E N D
第一章 绪论 • 学习要点: • ● 数据、数据元素和数据项基本概念。 • ● 数据类型和抽象数据类型基本概念及其联系与区别。 • ● 数据结构基本概念,数据逻辑结构的四种基本类型,数据存储结构两种基本类型。 • ● 理解数据存储结构除了存储数据元素本身,更重要的是要存储数据元素之间关系。 • ● 算法基本概念与特性,如何评价算法的效率。 • ● 认识和理解数据结构在计算机学科中的地位与意义。
1.1 数据 • 1.1.1 数据基本概念 • 数据是对客观事物的描述,是信息的载体,是能够被计算机识别、存储和加工处理的各种形式的总和。 • 1.1.2数值型与非数值型数据 • ① 数值型数据 主要包括整数、实数和复数等可以“直接”计算的数据,这些数据可以通过数制转换“直接”进入计算机。 • ② 非数值型数据 主要包括字符、文字、图像、音频等
1.2数据项与数据元素 • 数据项: • 数据项是数据的不可分割的最小单位,具有独立含义。 • 数据元素: • 对计算机而言,计算机能够处理的一个最小单位是数据元素,在计算机程序中通常作为一个整体考虑。 • 数据对象是同类型的数据元素的集合,是研究问题的一个子集。 • 数据对象: • 是“同类”的数据元素的集合,它是研究相应问题的一个子集。
1.3数据类型与抽象数据类型ADT • 1.3.1数据类型 • 数据元素中每个数据项有一个数据类型,数据类型是一组性质相同的值的集合以及定义在这个集合上的一组操作的总称。(原子类型,复杂类型) • 1.3.2抽象数据类型ADT • 抽象数据类型是定义了对数据元素的一组基本操作的集合。通常是由用户自己定义的一些基本操作的数据模型。 ADT 抽象数据类型名称{ 数据对象(数据元素的组成定义) 数据关系(数据结构的基本描述) 数据操作(基本操作的函数声明) } ADT 抽象数据类型名称
1.4数据模型与数据结构 • 1.4.1数据逻辑结构 • 数据结构可分解为“数据”+“结构”。“结构”我们可以这样理解:计算机要处理的这组数据元素并非孤立存在的,它们之间存在某种关系,这种数据元素间的关系称为结构,或者逻辑结构。
1.4.1数据逻辑结构2 • (1)集合结构:数据元素同属一个集合,别无任何关系。每个数据元素都和其它任何元素无关系,孤立存在。 • (2)线性结构:数据元素存在一个对一个的线性关系,如学籍表,记录一个连着一个,像一条线。 • (3)树型结构:数据元素存在一个对多个的关系,层次结构很明显,如人事系统,像一棵倒挂的树。 • (4)图型结构:数据元素之间的关系很任意,错综复杂,存在多个对多个的关系,如公交站点,像一个网,所以图型结构也称为网状结构。
1.4.2 数据存储结构 • 存储结构指的是逻辑结构在存储地址上的映像方式。 • 顺序存储结构:用一个连续的地址空间,按某个次序依次存放数据元素。 • 链式存储结构:用任意的地址空间来存放数据元素,数据元素的逻辑关系靠指针来联系。 • 散列存储结构:散列存储是指选择一个适当的散列函数,将数据元素作为变量,映射到存储地址中去。 • 索引存储结构:索引存储是将数据元素分组,通过事先设计好的索引表,将组内的数据元素的地址指引到某段存储地址区间,从而方便地读取到数据元素。
1.5数据操作与算法 • 1.5.1 数据运算 • ① 根据运算结果的不同,可以将运算分为“引用型”与“加工型”两种类型。 • ②根据运算本身所在组成层次不同,可以将运算分为基本运算和复杂运算两种情形。
1.5.2算法概念与描述 • 1.算法基本特征 • 输入。是指算法要操作的对象。这个输入可以是从键盘输入,也可以是文件读取,或者其它程序的运行结果等多种形式的输入。 • 有穷性。一个算法必须在执行了有穷步之后结束。否则陷入了一个死循环,不能称之为一个合理的算法。 • 确定性。算法中的每一个指令都必须有确切的含义,不能有二义性。例如分支语句,输入了某个条件,执行语句的哪个分支是明确的,在任何条件下,输入一样,执行的结果也肯定一样。 • 可行性。算法中描述的操作是可以通过已实现的操作来完成的。就是使用现有的计算机程序语言是可以完成执行的。 • 输出。是指算法执行的结果,与输入存在着某种关联。
1.5.2算法概念与描述2 • 2. 算法基本要求 • (1)正确性。一个算法必须是正确的,即保证能得到正确的结果,否则就不用用它来解决提出的问题,得出的结果也没有意义。 • (2)可读性。一个好的算法要便于用户理解和交流。可读性好的程序便于读者理解,也便于调试与修改,这有赖于程序设计员平时编程风格的形成和良好编程习惯的培养。 • (3)健壮性。也叫容错能力,即对非法的输入的抵抗能力。当输入一个非法的数据时,是能识别并提示,而不是输出一个错误结果,甚至直接瘫痪。 • (4)高效率。算法的效率指的是算法的执行时间。
1.5.2算法概念与描述3 • 3. 算法描述 • 程序设计语言描述 • 采用某种高级程序设计语言例如C或C++来描述算法。 • 自然语言描述 • 采用自然语言,同时添加上高级程序设计语言中的基本控制语句例如while、for和if等。 • 类语言描述 • 介于程序设计语言和自然语言之间算法描述形式,其特征是突出算法设计的主体部分而有意忽略其中某些过于严格的语法细节。
1.5.3 算法设计与分析 • 例:输出数据集合中的第i个元素 • 情况1:用数组组织元素 • printf(“%d”,a[i]); • 情况2:用单链表组织元素 p=head; for (k=0;k<i;k++) p=p->next; printf(“%d”,p->data); 完成同一操作所用时间显然不同!
1.5.3 算法设计与分析2 • 完成某求解问题规模为n的算法所需要的时间和执行算法过程中需要占用的空间按某种单位为S(n)和T(n),分别称为空间复杂度和时间复杂度。 • 1.时间复杂度 • 完成一个算法的时间大致等于其所有语句执行时间的总和。 • 在计算时间复杂度时,只关心完成问题规模n的算法时间的数量级,记为O(n)。数量级则只关心n的最高次幂以及忽略系数。
例1: • x=0;y=0; • for(i=0;i<n;i++) • {x=x+i; y=y+1;} 时间复杂度:0(n)
例2: • x=0; • for(i=0;i<n;i++) • for(j=0;j<n;j++) • if(a[i][j]==0) • x=x+1; 时间复杂度:0(n2)
例3: • x=0; • for(i=0;i<n;i++) • for(j=0;j<i;j++) • if(a[i][j]==0) • x=x+1; 时间复杂度:0(n2)
1.5.3 算法设计与分析2 1.时间复杂度2 一般数据结构中常见的时间复杂度的数量级有7个: O(1) 常数型O(n) 线性型O(n2) 平方型 O(n3) 立方型 O(2n) 指数型 O(log2n) 对数型 O(nlog2n) 二维型 当n足够大时,时间复杂度的增长趋势可以做如下排序: O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n)
练习1: • for(i=0;i<n;i++) • for(j=0;j<i;j++) • for(k=0;k<j;k++) • {s=i+k; • printf(“%d”,s); • } 时间复杂度:0(n3)
练习2: • i=1;k=0; /*n!=1*/ • do {k=k+10*i; • i++; • } while(i==n) 时间复杂度:0(1)
练习3: • x=n; /*n>1*/ • y=0; • while(x>=(y+1)*(y+1)) • y++; 时间复杂度:0(n1/2)
练习4: • m=91; • while(n>0) • if (m>0) {m=m-10;n--;} • else m++; 时间复杂度:0(n)
1.5.3 算法设计与分析3 • 2.空间复杂度 • 空间复杂度指完成整个算法过程中需要占用的辅助空间,我们往往将一个简单变量占用的空间视为单位空间1,然后分析空间大小与问题规模n形成的函数,同样只关心数量级,用大O记号标记。
1.6 数据结构的地位与内容体系 • 1.6.1 数据结构课程的地位 • 数据结构在整个课程体系中处于承上启下的地位,是计算机科学的核心课程。
1.6.3 课程学习建议 • 本章小结