数据结构(1)绪论
绪论
1.数据结构的基本概念
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
数据结构是指互相之间存在一种或多种特定关系的数据元素的集合。
数据是信息的载体,是客观事物的符号表示。数据能够被计算机识别、存取和处理的“原料”。其中,数据既是计算机操作的对象的总称,也是人们利用文字符号、数字符号以及其他规定的符号对现实世界的事物及其活动所做的抽象描述。
数据元素是数据的基本单位。一个数据元素可以由若干个数据项组成。
数据项是数据不可分割的最小单位或具有独立含义的最小标识单位。
数据对象是指性质相同的数据元素的集合,是数据集合的一个子集。
数据类型是具有相同性质的计算机数据的集合及在这个数据集合上的一组操作。
数据类型分为原子数据类型和结构数据类型。其中,原子数据类型是由计算机语言提供的,结构数据类型是借用计算机语言提供的一种描述数据元素之间的逻辑关系的机制。
抽象数据类型(ADT)是指一个逻辑概念上的类型和这个类型上的操作集合。
抽象数据类型表示为一个三元组(D,R,P),其中D是数据对象,R是D上的关系集,P是对D的基本操作。
数据结构是指数据之间的互相关系,即数组的组织形式,一般分为数据的逻辑结构、数据的存储结构、数据的运算。其中,数据的逻辑结构是指数据元素之间的逻辑关系。数据的存储结构是指数据元素及其关系在计算机存储内的表示。数据的运算是指对数据施加的操作。
数据的逻辑结构分为线性结构和非线性结构。其中,线性结构的逻辑特征是有且仅有一个开始结点和一个终端结点,并且所有结点都最多一个直接前驱和一个直接后继。非线性结构的逻辑特征是一个结点可能有多个直接前驱和直接后继。
数据的存储结构分为顺序存储、链式存储、索引存储、散列存储。
顺序存储结构是把数据元素存储在一块连续地址空间的内存中,其特点是,逻辑上相邻的数据元素在物理上也相邻,数据间的逻辑关系表现在数据元素的存储位置关系上。
通常情况下,顺序存储结构是通过程序中的数组来描述。
链式存储结构是使用指针把相互直接关联的结点(即直接前驱结点或直接后继结点)链接起来,其特点是逻辑相邻的数据元素在物理上(即内存存储位置上)不一定相邻,数据间的逻辑关系表现在结点的链接关系上。
通常情况下,链式存储结构是通过程序中的指针类型来描述。
索引存储结构通常是在存储结点信息的同时,并建立附加的索引表。其中,索引表中的每一项称为索引项,索引项的一般形式为:(关键字,地址),关键字是能唯一标识一个结点的那些数据项。若每个结点在索引表中均有一个索引项,则该索引表称为稠密索引。若一组结点在索引表中只对应一个索引项,则该索引表称为稀疏索引。稠密存储中索引项地址指出结点所在的存储位置,而稀疏索引中索引项的地址则指出一组结点的起始存储位置。
散列存储结构是根据结点的关键字直接计算出该结点的存储地址。
按照数据元素之间的互相联系方式,数据的逻辑结构主要可分为集合结构、线性结构、树型结构和图型结构四种。1)集合结构的数据元素同属于一个集合,它们之间是并列关系,除此之外没有其他关系。 2)线性结构是除第一个和最后一个数据元素之外,每个数据元素只有一个唯一的前驱数据元素和一个唯一的后继数据元素。线性结构中农的数据元素之间存在一个一对一的关系。3)树型结构是除根结点外,每个数据元素只有一个唯一的前驱数据元素,可有零个或若干个后继数据元素。树形结构中的数据元素存在一个一对多的关系。 4)图型结构是每个数据元素有零个或若干个前驱数据元素和零个或若干个后继数据元素。图状结构中的数据元素之间存在多个多对多的关系。
数据结构的形式定义通常用一个二元组为:Structure = (D,S) 其中,D表示数据元素有限集合,R是D中元素之间关系的集合。
1.2 算法描述
算法是对特定问题求解步骤的一种描述。它是由若干条指令组成的有穷序列,其中每一条指令表示一个或多个操作。描述求解问题方法的操作步骤集合。
算法具有五个基本特征:有穷性,确定性,可行性,输入,输出。1)有穷性:有限步骤必须结束,即每一条指令的执行次数必须是有限的。2)确定性:每条指令的含义都必须明确,无二义性。3)可行性:每条指令必须可以执行并有正确的结果,即每条指令的执行时间均是有限的。4)输入:一个算法可以有零个或多个输入,它们是在算法开始前对算法给定的最初量。这些输入取自于特定对象的集合。5)输出:一个算法至少要有一个输出,它们与输入有某种特定关系。
描述算法的语言主要有三种形式:文字形式、伪代码形式和程序设计语言形式。文字形式是指用中文或英文来描述。伪代码形式是指用一种仿程序设计语言的语言来描述算法。程序设计语言形式是指用某种高级程序设计语言来描述算法。
算法设计应满足正确性、可读性、健壮性、高时间效率、高空间效率。
算法分析分为分析算法的时间复杂度和空间复杂度。
算法的耗时与算法所处理数据个数n的函数关系的分析称作算法的时间效率分析。
算法的时间效率分析主要分析算法的耗时与算法所处理数据个数n的数量级意义上的函数关系。因此,算法的时间效率分析也称作算法的时间复杂度分析。
算法的时间复杂度分析通常用O(f(n))表示法。
一个程序的空间复杂度是指程序运行从开始到结束所需的存储量与问题规模的对应关系,记作S(n) = O(f(n))。其中,n为问题的规模或大小。
在大多数算法设计中,时间效率和空间效率两者很难兼得。设计者往往需要根据具体的问题进行权衡,有时会用更多的存储空间来换取时间,有时会用增加算法执行的时间来减少所需要的存储空间。