您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习笔记(一)基础概念

2016-07-11 15:14 274 查看
在学习数据结构时,可以使用网址http://zh.visualgo.net/直观的学习各种操作
1、数据(Data)和
     数据是外部世界信息的载体,是描述客观事物的符号,它能够被计算机识别、存储和加工处理,是计算机程序加工的原料。计算机程序处理各种各样的数据,可以是数值数据,如整数、实数或复数;也可以是非数值数据,如字符、文字、图形、图像、声音等。

2、数据元素(Data Element)和数(DataItem)  

     数据元素是数据的基本单位,在计算机程序中通常被作为一个整体进行考虑和处理。数据元素有时也被称为元素、结点、顶点、记录等。一个数据元素可由若干个数据项(Data Item)组成。数据项是不可分割的、含有独立意义的最小数据单位,数据项有时也称为字段(Field)或域(Domain)。例如,在数据库信息处理系统中,数据表中的一条记录就是一个数据元素。这条记录中的学生学号、姓名、性别、籍贯、出生年月、成绩等字段就是数据项。数据项分为两种,一种叫做初等项,如学生的性别、籍贯等,在处理时不能再进行分割;另一种叫做组合项,如学生的成绩,它可以再分为数学、物理、化学等更小的项。                                                          
           

3、数据对象(Data Object)

     数据对象是性质相同的数据元素的集合,是数据的一个子集。例如,整数数据对象是{0,±1,±2,±3,…},字符数据对象是{a,b,c,…}。

4、数据结构(Data Structure)


  数据结构是相互之间存在一种或多种特定关系的数据元素的集合。在任何问题中,数据元素之间都不是孤立的,而是存在着一定的关系,这种关系称为结构(Structure)。根据数据元素之间关系的不同特性,通常有4类基本数据结构:

 集合(Set):如图(a)所示,该结构中的数据元素除了存在“同属于一个集合”的关系外,不存在任何其它关系。

线性结构(Linear
Structure):如图(b)所示,该结构中的数据元素存在着一对一的关系。

树形结构(Tree
Structure):如图(c)所示,该结构中的数据元素存在着一对多的关系。

图状结构(Graphic
Structure):如图(d)所示,该结构中的数据元素存在着多对多的关系。

  


  数据结构的形式化定义为:数据结构(Data Structure)简记为DS,是一个二元组,DS = (D,R)。其中:D是数据元素的有限集合,R是数据元素之间关系的有限集合。

5、逻辑结构和物理结构

     上述数据结构的定义就是数据的逻辑结构(Logic Structure),数据的逻辑结构是从具体问题抽象出来的数学模型,是为了讨论问题的方便,与数据在计算机中的具体存储没有关系。然而,我们讨论数据结构的目的是为了在计算机中实现对它的操作,因此还需要研究在计算机中如何表示和存储数据结构,即数据的物理结构(Physical
Structure)。数据的物理结构又称为存储结构(Storage Structure),是数据在计算机中的表示(又叫映像)和存储,包括数据元素的表示和存储以及数据元素之间关系的表示和存储。
     数据的存储结构包括顺序存储结构和链式存储结构两种。顺序存储结构(Sequence
Storage Structure)是通过数据元素在计算机存储器中的相对位置来表示出数据元素的逻辑关系,一般把逻辑上相邻的数据元素存储在物理位置相邻的存储单元中。在C++语言中用数组来实现顺序存储结构。因为数组所分配的存储空间是连续的,所以数组天生就具有实现数据顺序存储结构的能力。链式存储结构(Linked Storage Structure)对逻辑上相邻的数据元素不要求其存储位置必须相邻。链式存储结构中的数据元素称为结点(Node),在结点中附设地址域(Address Domain)来存储与该结点相邻的结点的地址来实现结点间的逻辑关系。这个地址称为引用(Reference),这个地址域称为引用域(Reference
Domain)。
6、数据类型和抽象数据类型
 
   数据类型是高级程序设计语言中的概念,是指一组性质相同的值的集合及定义在此集合上的一些操作的总称,也可以说是数据的取值范围和对数据进行操作的总和。数据类型规定了程序中对象的特性。程序中的每个变量、常量或表达式的结果都应该属于某种确定的数据类型。例如,C++语言中的字符串类型(String,经常写为string)。一个String表示一个恒定不变的字符序列集合,所有的字符序列集合构成String的取值范围。我们可以对String进行求长度、复制、连接两个字符串等操作。数据类型可分为两类:一类是非结构的原子类型,如C++语言中的基本类型(整型、实型、字符型等);另一类是结构类型,它的成分可以由多个结构类型组成,并可以分解。结构类型的成分可以是非结构的,也可以是结构的。例如,C++语言中数组的成分可以是整型等基本类型,也可以是数组等结构类型。
 
   我们将数据类型进行抽象,就有了抽象数据类型。抽象数据类型(ADT:Abstract Data Type)是指一个数学模型及定义在此模型上的一组操作。抽象数据类型的定义仅仅取决于它的逻辑操作,与它在计算机内部如何表示和实现无关。比如在各个不同的计算机中,不论个人PC、还是平板或者大型机中都有“整数”类型,也需要关于整数类型的各种操作,但是我们并不关心它在不同的计算机上是如何实现的。抽象的意义就在于数据类型的数抽象特性。
7、算法定义及其特性
     算法(Algorithm)是对某一特定类型的问题的求解步骤的一种描述,是指令的有限序列。其中的每条指令表示一个或多个操作。一个算法应该具备以下5个特性:

有穷性(Finity):一个算法总是在执行有穷步之后结束,即算法的执行时间是有限的。

确定性(Unambiguousness):算法的每一个步骤都必须有确切的含义,即无二义,并且对于相同的输入只能有相同的输出。
输入(Input):一个算法具有零个或多个输入。它即是在算法开始之前给出的量。这些输入是某数据结构中的数据对象。
输出(Output):一个算法具有一个或多个输出,并且这些输出与输入之间存在着某种特定的关系。
可行性(realizability):算法中的每一步都可以通过已经实现的基本运算的有限次运行来实现。

     算法的含义与程序非常相似,但二者有区别。一个程序不一定满足有穷性。例如操作系统,只要整个系统不遭破坏,它将永远不会停止。还有,一个程序只能用计算机语言来描述,也就是说,程序中的指令必须是机器可执行的,而算法不一定用计算机语言来描述,自然语言、框图、伪代码都可以描述算法。
8、算法的评价问题
     对于一个特定的问题,采用的数据结构不同,其设计的算法一般也不同,即使在同一种数据结构下,也可以采用不同的算法。那么,对于解决同一问题的不同算法,选择哪一种算法比较合适,以及如何对现有的算法进行改进,从而设计出更适合于数据结构的算法,这就是算法评价的问题。评价一个算法优劣的主要标准如下:

正确性(Correctness)。算法的执行结果应当满足预先规定的功能和性能的要求,这是评价一个算法的最重要也是最基本的标准。算法的正确性还包括对于输入、输出处理的明确而无歧义的描述。
可读性(Readability)。算法主要是为了人阅读和交流,其次才是机器的执行。所以,一个算法应当思路清晰、层次分明、简单明了、易读易懂。一个可读性强的算法也有助于对算法中隐藏错误的排除和算法的移植。
健壮性(Robustness)。一个算法应该具有很强的容错能力,当输入不合法的数据时,算法应当能做适当的处理,使得不至于引起严重的后果。健壮性要求表明算法要全面细致地考虑所有可能出现的边界情况和异常情况,并对这些边界情况和异常情况做出妥善的处理,尽可能使算法没有意外的情况发生。
运行时间(Running Time)。运行时间是指算法在计算机上运行所花费的时间,它等于算法中每条语句执行时间的总和。对于同一个问题如果有多个算法可供选择,应尽可能选择执行时间短的算法。一般来说,执行时间越短,性能越好。
占用空间(Storage Space)。占用空间是指算法在计算机上存储所占用的存储空间,包括存储算法本身所占用的存储空间、算法的输入及输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间。算法占用的存储空间是指算法执行过程中所需要的最大存储空间,对于一个问题如果有多个算法可供选择,应尽可能选择存储量需求低的算法。实际上,算法的时间效率和空间效率经常是一对矛盾,相互抵触。我们要根据问题的实际需要进行灵活的处理,有时需要牺牲空间来换取时间,有时需要牺牲时间来换取空间。
     当我们真正的去衡量一个算法的效率时,一般有事后统计和事前分析估算两种方法。我们一般学习和使用的都是第二种。具体的想法和思路可以在学习算法的时候去了解,我们应该了解关于算法的最好、最坏以及平均情况的分析,以及算法中函数的渐进增长等等。这里不再详细谈论,不过我们应该建立起算法时间复杂度和空间复杂度的概念,尤其是时间T(n)的度量。这样我们在程序设计时,会有一个好与坏的概念。
     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构