数据结构总结(一)
来源:互联网 发布:男士发簪 淘宝 编辑:程序博客网 时间:2024/05/30 02:25
数据结构的基本概念和术语
1.数据
数据是信息的载体,是描述客观事物属性的数,字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。
2.数据元素
数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干个数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号,姓名,性别等数据项组成。
注意: 不要混淆数据,数据元素,数据项之间的概念,也要注意和数据库中的相关术语进行区别:如数据记录,数据字段等概念。
3.数据对象
数据对象是具有相同性质的数据元素的集合,是数据的一个子集。例如,正整数数据对象是集合N={0,1,2,3….}.
4.数据类型
数据类型是一个值的集合和定义在此集合上一组操作的总称。
- 原子结构:其值不可再分的数据类型
- 结构类型:其值可以再分解为若千成分(分量)的数据类型
- 抽象数据类型:抽象数据组织和与之相关的操作
5.抽象数据类型
抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部结构如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部的使用。通常用(数据结构,数据对象,基本操做)这样的三元组来表示抽象数据类型。
6.数据结构
在任何问题中,数据元素都不是孤立的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构(structure).数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据结构包括三方面的内容:逻辑结构,存储结构和数据的运算。数据的逻辑结构和存储结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。
数据结构三要素:数据逻辑结构、数据存储结构和数据的运算
1.数据的逻辑结构
- 集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其他关系。
- 线性结构:结构中的数据元素之间存在着一对一的线性关系
- 树形结构:结构中的元素之间存在着一对多的层次关系
- 图状结构:结构中的数据元素之间存在着多对多的任意关系
2.数据的存储结构
存储结构是指数据结构在计算机中的表示(又称映像),也称物理结构。它包括数据元素的表示和关系的表示。数据的存储结构是逻辑结构用计算机语言的实现,它依赖于计算机语言。数据的存储结构主要有:顺序存储、链式存储、索引存储和散列存储。
1. 顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元里,元素之间的关系由存储单元的邻接关系来体现。其优点是可以实现随机存取,每个元素占用最少的存储空间;缺点是只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片。
2. 链接存储:不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储地址的指针表示元素之间的逻辑关系。其优点是不会出现碎片现象,充分利用所有存储单元;缺点是每个元素因存储指针而占用额外的存储空间,并且只能实现顺序存取。
3. 索引存储:在存储元素信息的同时,还建立附加的索引表。索引表中的每一项称为索引项,索引项的一般形式是:(关键字,地址)。其优点是检索速度快;缺点是增加了附加的索引表,会占用较多的存储空间。另外,在增加和删除数据时要修改索引表,因而会花费较多的时间。
3.数据的运算
施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。
一.单项选择题
1. 可以用(D)定义一个完整的数据结构。A.数据元素 B.数据对象 C.数据关系 D.抽象数据类型2. 以下数据结构中,( A)是非线性数据结构。A.树 B.字符串 C.队列 D.栈3. 以下属于逻辑结构的是(c)。A.顺序表 B.哈希表 C.有序表 D.单链表4.以下与数据的存储结构无关的术语是(D )。A.循环队列 B.链表 C.哈希表 D.栈5.以下关于数据结构的说法中,正确的是(A )。A.数据的逻辑结构独立于其存储结构B.数据的存储结构独立于其逻辑结构C.数据的逻辑结构唯一决定了其存储结构D.数据结构仅由其逻辑结构和存储结构决定6.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储(C )。A.数据的操作方法 B.数据元素的类型C.数据元素之间的关系 D.数据的存取方法7.链式存储设计时,结点内的存储单元地址(A)。A. 一定连续 B. —定不连续C.不一定连续 D.部分连续,部分不连续
二、综合应用题
1. 对于两种不同的数据结构,逻辑结构或物理结构一定不相同吗?2. 试举一例,说明对相同的逻辑结构,同一种运算在不同的存储方式下实现,其运算效率不同。
答案与解析一、单项选择题1. D抽象数据类型(ADT)描述了数据的逻辑结构和抽象运算,通常用(数据对象,数据关系,基本操作集)这样的三元组来表示,从而构成了一个完整的数据结构定义。2. A树和图是典型的非线性数据结构,其他选项都属于线性数据结构。3. C顺序表、哈希表和单链表表示几种数据结构,既描述逻辑结构,也描述存储结构和数据运算。而有序表是指关键字有序的线性表,可以链式存储也可以顺序存储,仅描述了元素之间的逻辑关系,故它属于逻辑结构。4. D数据的存储结构有顺序存储、链式存储、索引存储和散列存储。循环队列(易错点)是用顺序表表示的队列,是一种数据结构。栈是一种抽象数据类型,可釆用顺序存储或链式存储,只表示逻辑结构。5. A数据的逻辑结构是以面向实际问题的角度出发的,只釆用抽象表达方式,独立于存储结构,数据的存储方式有多种不同的选择;而数据的存储结构是逻辑结构在计算机上的映射,它不能独立于逻辑结构而存在。数据结构包括三个要素,缺一不可。6. C在存储数据时,不仅要存储数据元素的值,还要存储数据元素之间的关系。7. A链式存储设计时,各个不同结点的存储空间可以不连续,但是结点内的存储单元地址则必须连续。二、综合应用题1. 解答:应该注意到,数据的运算也是数据结构的一个重要方面。对于两种不同的数据结构,它们的逻辑结构和物理结构完全有可能相同。比如二叉树和二叉排序树,二叉排序树可以釆用二叉树的逻辑表示和存储方式,前者通常用来表示层次关系,而后者通常用于排序和查找。虽然它们的运算都有建立树、插入结点、删除结点和查找结点等,但是对于二叉树和二叉排序树,这些运算的定义是不同的,以查找结点为例,二叉树的时间复杂度为O(n),而二叉排序树的时间复杂度为O(log2n)。,2.解答:线性表既可以用顺序存储方式实现,也可以用链式存储方式实现。在顺序存储方式下,在线性表中插入和删除元素,平均要移动近一半的元素,时间复杂度为O(n);而在链式存储方式下,插入和删除的时间复杂度都是O(1)。
算法的基本概念及特性(有穷性、确定性、可行性、输入和输出)
算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。此外,一个算法还具有下列5个重要特性:1) 有穷性一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。2) 确定性算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。即对于相同的输入只能得出相同的输出。3) 可行性一个算法是可行的,即算法中描述的操作都是吋以逋过已经实现的基本运算执行有限次来实现的。4) 输入一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。5) 输出一个算法有一个或多个的输出,这些输出是同输入有着某种特定关系的量。通常设计一个“好”的算法应考虑达到以下目标: 正确性:算法应当能够正确地解决求解问题。 可读性:算法应当具有良好的可读性,以助于人们理解。 健壮性:当输入非法数据时,算法也能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。 效率与低存储量需求:效率是指算法执行的时间,存储量需求是指算法执行过程中所需要的最大存储空间,这两者都与问题的规模有关。
算法效率度量:时间复杂度和空间复杂度
时间复杂度
一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记作T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级。算法中的基本运算(最深层循环内的语句)的频度与T(n)同数量级,所以通常釆用算法中基本运算的频度 f(n)来分析算法的时间复杂度。因此,算法的时间复杂度也记为:
T(n)=O(f(n))
上式中“O”的含义是T(n)的数量级,其严格的数学定义是:若T(n)和f(n)是定义在正整数集合上的两个函数,则存在正常数C和n0,使得当n>=n0时,都满足0 <= T(n) <= C * f(n)。
注意:取f(n)中随n增长最快的项将其系数置为1作为时间复杂度的度量。例如,fi(n) = a * n3 + b * n2 + c * n,则其时间复杂度为O(n3)。
算法的时间复杂度不仅依赖于问题的规模n,也取决于待输入数据的性质(如输入数据元素的初始状态)。
例如:在数组A[0…n-1]中,查找给定值K的算法大致如下:
i=n-1;while( i>=0 && (A[i]!=k) ) i--; // 语句(3)return i;
此算法中的语句(3)(基本运算)的频度不仅与问题规模n有关,还与输入实例中A 的各元素取值及K的取值有关:
若A中没有与K相等的元素,则语句(3)的频度 f(n)=n。
若A的最后一个元素等于K,则语句(3)的频度f(n)是常数0。
最坏时间复杂度是指在最坏情况下,算法的时间复杂度。
平均时间复杂度是指所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
最好时间复杂度是指在最好情况下,算法的时间复杂度。
一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
在分析一个程序的时间复杂性时,有以下两条规则:
a) 加法规则
T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n), g(n)))
b) 乘法规则
T(n) = T1(n) * T2(n) = O(f(n)) * O(g(n)) = O( f(n) * g(n) )
常见的渐近时间复杂度有:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
空间复杂度
算法的空间复杂度S(n),定义为该算法所耗费的存储空间,它是问题规模n的函数。渐近空间复杂度也常简称为空间复杂度,记作S(n)=O(g(n))。
一个上机程序除了需要存储空间来存放本身所用指令、常数、变量和输入数据外,也需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间,若输入数据所占空间只取决于问题本身,和算法无关,则只需分析除输入和程序之外的额外空间。
算法原地工作是指算法所需辅助空间是常量,即O(1)。
算法及其时间复杂度和空间复杂度的习题
一、单项选择题1.一个算法应该是( )。A.程序 B.问题求解步骤的描述 C.要满足五个基本特性 D. A和C2.某算法的时间复杂度为O(n2),表明该算法的( )。A.问题规模是n2 B.执行时间等于n2C.执行时间与n2成正比 D.问题规模与n2成正比3.以下算法的时间复杂度为( )。void fun(int n) { int i=l; while(i<=n) i=i*2;}A. O(n) B. O(n2) C. O(nlog2n) D. O(log2n)4.【2011年计算机联考真题】设n是描述问题规模的非负整数,下面程序片段的时间复杂度是()。 x=2; while(x<n/2) x=2*x;A. O(log2n) B. O(n) C. O(nlog2n) D. O(n2)5.【2012年计算机联考真题】求整数n (n>=0)阶乘的算法如下,其时间复杂度是( )。 int fact(int n){ if (n<=l) return 1; return n*fact(n-1); }A. O(log2n) B. O(n) C. O(nlog2n) D. O(n2)6.有以下算法,其时间复杂度为( )。 void fun (int n){ int i=0; while(i*i*i<=n) i++; }A. O(n) B. O(nlogn) C. D. 7.程序段 for(i=n-l;i>l;i--) for(j=1;j<i;j++) if (A[j]>A[j+l]) A[j]与 A[j+1]对换;其中n为正整数,则最后一行的语句频度在最坏情况下是( )。A. O(n) B. O(nlogn) C. O(n3) D. O(n2)8.以下算法中加下划线语句的执行次数为()。 int m=0, i, j; for(i=l;i<=n;i++) for(j=1;j<=2 * i;j++) m++;A. n(n+1) B. n C. n+1 D. n29.下面说法错误的是( )。Ⅰ.算法原地工作的含义是指不需要任何额外的辅助空间Ⅱ.在相同的规模n下,复杂度O(n)的算法在时间上总是优于复杂度O(2n)的算法Ⅲ.所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界Ⅳ.同一个算法,实现语言的级别越高,执行效率就越低A. Ⅰ B. Ⅰ、Ⅱ C. Ⅰ、Ⅳ D. Ⅲ
二、综合应用题
1.一个算法所需时间由下述递归方程表示,试求出该算法的时间复杂度的级别(或阶)。
式中,n是问题的规模,为简单起见,设n是2的整数幂。
2.分析以下各程序段,求出算法的时间复杂度。
// 程序段①i=l;k=0;while(i<n-l){ k=k+10*i; i++;}// 程序段②y=0;while((y+1)*(y+1)<=n) y=y+1;// 程序段③for(i=l;i<=n;i++) for(j =1;j <=i;j ++) for(k=l;k<=j;k++) x++;// 程序段④for(i=0;i<n;i++) for(j=0;j<m;j++) a[i] [j]=0;
- 数据结构总结(一)
- 数据结构学习总结(一)
- 数据结构链表总结一
- Nginx高级数据结构总结(一)
- 数据结构总结(摘抄)(一)
- 数据结构及算法学习总结(一)
- 数据结构和算法总结(一)
- 数据结构及算法学习总结(一)
- 数据结构HASH总结一:理论学习篇
- 数据结构总结:(一)顺序表
- 数据结构-各类排序算法总结(一)
- 数据结构HASH总结一:理论学习篇
- 数据结构-Hash总结(一):理论学习篇
- 数据结构之大体脉络总结(一)
- 数据结构复习一:哈希表的总结
- [总结]数据结构真是博大精深(一)
- java中数据结构(一)单链表总结
- Python与数据结构总结(一)
- Android 7.0的一些变更
- Android源码解析RPC系列(一)---Binder原理
- LINUX下使用KDevelop
- 【备忘】HEVC/H.265学习的相关网站、博客
- margin:0 auto;不居中的原因
- 数据结构总结(一)
- 欢迎使用CSDN-markdown编辑器
- (27)三次插值样条曲线
- linux mint下使用外部SMTP(如网易yeah.net)发邮件
- 原来是它,发现ubuntu一年的秘密
- 【Git官方文档翻译】1. 新手入门
- java泛型
- MongDB在linux服务端配置安装以及数据备份
- HTML+CSS学习笔记二