数据结构与算法基础 第一章 绪论
Posted Shany-Ming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法基础 第一章 绪论相关的知识,希望对你有一定的参考价值。
目录
引言
为什么学习数据结构和算法?
凭借一句话获得图灵奖的Pascal语言之父——Nicklaus Wirth,让他获得图灵奖的这句话就是他提出的著名公式:
“程序=数据结构+算法”
----这个公式展现了程序的本质:
算法其实就是用于解决某一类问题的公式与思想。(给出问题的数学模型)而数据结构就是数据的组织、管理和存储格式,其使用目的是为了高效的访问和修改数据。至于程序就是计算机处理问题的一系列指令。
程序设计的实质是对确定的问题选择一种好的数据结构,并设计一种好的算法。
一,基本概念与术语
对于基本概念的掌握,不要求完全一致,但含义不能有误
1.数据、数据元素、数据项和数据对象
数据(Data)是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称(集合)。是信息的载体;是对客观事物的符号化表示;可以被计算机识别、存储和加工。数据不仅仅包含整型、实型等数值类型,还包含图形、图像、声音、视频及动画等非数值类型 。
数据元素(DataElement)是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也称为元素、记录等。数据元素用千完整地描述一个对象,如前一节示例中的一名学生记录,树中棋盘的一个格局(状态),以及图中的一个顶点等。
数据项(DataItem)是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生基本信息表中的学号、姓名、性别等都是数据项。
数据对象(DataObject)是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N=O,士1'士2,…, 字母字符数据对象是集合C='A','B',…,'Z','a','b',…,'z',学生基本信息表也可以是一个数据对象。由此可以看出,不论数据元素集合是无限集(如整数集),或是有限集(如字母字符集),还是由多个数据项组成的复合数据元素(如学生表)的集合,只要集合内元素的性质均相同,都可称之为一个数据对象。
据上,我们可总结他们间的关系:数据>数据对象>数据元素>数据项
2.数据结构
说了那么多,接下来,我们就来说说什么是数据结构
数据结构(DataStructure)是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带”结构"的数据元素的集合,“结构”就是指数据元素之间存在的关系。
数据结构分为两类:逻辑结构与存储结构
1)逻辑结构
数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立千计算机的。因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。
数据的逻辑结构有两个要素:一是数据元素;二是关系。数据元素的含义如前所述,关系是指数据元素间的逻辑关系。根据数据元素之间关系的不同特性,通常有四类基本结构,它们的复杂程度依次递进
(1)集合结构数据元素之间除了“属于同一集合”的关系外,别无其他关系。例如,确定一名学生是否为班级成员,只需将班级看做一个集合结构。
(2)线性结构数据元素之间存在一对一的关系。例如,将学生信息数据按照其入学报到的时间先后顺序进行排列,将组成一个线性结构。
(3)树结构数据元素之间存在一对多的关系。例如,在班级的管理体系中,班长管理多个组长,每位组长管理多名组员,从而构成树形结构。
(4)图结构或网状结构数据元素之间存在多对多的关系。例如,多位同学之间的朋友关系,任何两位同学都可以是朋友,从而构成图状结构或网状结构。
其中集合结构、树结构和图结构都属千非线性结构。
2) 存储结构
数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构。
1.顺序存储结构
顺序存储结构是把数据元素存放在连续的存储单元里,数据元素之间的逻辑关系是通过数据元素的位置。(在前面的数据元素就存在前面;在后面的数据元素就存在后面)C语言用数组来实现顺序存储结构
2.链式存储结构
顺序存储结构要求所有的元素依次存放在一片连续的存储空间中,而链式存储结构,无需占用一整块存储空间。但为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址。所以链式存储结构通常借助于程序设计语言的指针类型来描述
3).索引存储结构
在存储节点信息的同时,还建立附加索引,索引表中的每一项称为一个索引项,索引项的一般形式是:(关键字,地址)
关键字是能唯一标识一个结点的那些数据项。若每个结点在索引表中都有一个索引项,则该索引表称之为稠密索引(Dense Index)。
若一组结点在索引表中只对应一个索引项,则该索引表称之为稀疏索引(Sparse Index)。
就如我们手机中的通讯录。
4).散列存储结构
散列存储,又称hash存储,是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的查找技术。
散列法存储的基本思想是:由节点的关键码值决定节点的存储地址。散列技术除了可以用于查找外,还可以用于存储。
3.数据类型与抽象数据类型
1).数据类型
说到数据类型,其实我们并不陌生,就如c语言中的int,char,float,double等基本数据类型;数组、结构、共用体、枚举等构造数据类型;还有指针、空(void)类型,用户也可用typedef自己定义数据类型 。
数据类型是一个值的集合和定义在这个值集上的一组操作的总称
例如,C语言中的整型变址,其值集为某个区间上的整数(区间大小依赖于不同的机器),定义在其上的操作为加、减、乘、除和取模等算术运算;而实型变量也有自己的取值范围和相应运算,比如取模运算是不能用于实型变量的。
数据类型=值的集合+值集合上的一组操作
2).抽象数据类型
抽象数据类型(Abstract Data Type, ADT)一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据对象上关系的集合以及对数据对象的基本操作的集合。
抽象数据类型的形式定义:
基本操作格式定义说明:
参数表:赋值参数,只为操作提供输入值 引用参数以&打头。
初始条件:描述了操作执行之前数据结构和参数应满足的条件,若初始条件为空,则省略。
操作结果:说明了操作正常完成之后,数据结构的变化状况和应返回的结果。
抽象数据类型的表示及实现:
4.概念小结
二.算法和算法分析
1.算法的定义及特性
算法(Algorithm)是为了解决某类问题而规定的一个有限长的操作序列。
数据结构通过算法实现操作
算法根据数据结构设计程序
算法必须满足的五个特性:
(1)有穷性。一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。
(2)确定性。对千每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,使算法的执行者或阅读者都能明确其含义及如何执行。
(3)可行性。算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
(4)输入。一个算法有零个或多个输入。当用函数描述算法时,输入往往是通过形参表示的,在它们被调用时,从主调函数获得输入值。
(5)输出。一个算法有一个或多个输出,它们是算法进行信息加工后得到的结果,无输出的算法没有任何意义。当用函数描述算法时,输出多用返回值或引用类型的形参表示。
算法的评判标准:
1)正确性。在合理的数据输入下,能够在有限的运行时间内得到正确的结果。
(2)可读性。一个好的算法,首先应便千人们理解和相互交流,其次才是机器可执行性。可读性强的算法有助于人们对算法的理解,而难懂的算法易千隐藏错误,且难千调试和修改。
(3)健壮性。当输入的数据非法时,好的算法能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。
(4)高效性。高效性包括时间和空间两个方面。时间高效是指算法设计合理,执行效率高,可以用时间复杂度来度量;空间高效是指算法占用存储容量合理,可以用空间复杂度来度量。时间复杂度和空间复杂度是衡量算法的两个主要指标
在这几个条件都满足的情况下,我们就要考虑算法效率
2.算法的时间复杂度
1).语句频度及计算方式
一个算法的执行时间大致上等千其所有语句执行时间的总和,而语句的执行时间则为该条语句的重复执行次数和执行一次所需时间的乘积。
一条语句的重复执行次数称作语句频度。
但由于计算机的硬件关系,相同程序在不同计算机的运行程序的时间是不同的
所以:
设每条语句执行一次所需的时间均是单位时间,则一个算法的执行时间可用该算法中所有语句频度之和来度量
求两个n阶矩阵的乘积算法:
由于for循环需要判断,所以在到达n时还会进行一次判断,所以为n+1,但其下的子句仍然是n次,因为最后一次判断是错,所以最后一次并未进循环内部
2).算法时间复杂度的定义
为了便于比较两个不同的算法效率,我们仅比较他的数量级,如上乘积算法,它的数量级为n^3
上题的时间复杂度为T(n)=O(n^3)
3).最好、最坏和平均时间复杂度
最好时间复杂度,指的是算法计算量可能达到的最小值;
称算法在最坏情况下的时间复杂度为最坏时间复杂度,指的是算法计算量可能达到的最大值;
算法的平均时间复杂度是指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值
三.算法空间复杂度
关千算法的存储空间需求,类似千算法的时间复杂度,我们采用渐近空间复杂度作为算法所需存储空间的扯度,简称空间复杂度,它也是问题规模n的函数,记作:
S(n) = O(f (n)
算法本身要占据的空间:输入/输出、指令、常数、变量等。
算法要使用的辅助空间。
若输入数据所占据的空间只取决于问题本身和算法无关,这样只需分析该算法在实现时所需的辅助单元即可,若算法执行时所需的辅助单元相对于输入数据量而言是个常数,则称此算法为原地施工,空间复杂度为O(1)
以上是关于数据结构与算法基础 第一章 绪论的主要内容,如果未能解决你的问题,请参考以下文章