标签:
本文引自《新编数据结构习题与解析》(李春葆等著)第1章。
数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。例如,整数、实数和字符串都是数据。
数据元素也称为节点,是表示数据的基本单元,在计算机程序中通常作为一个整体进行考虑和处理。
数据项是数据的最小单位。数据元素可以由若干个数据项组成。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。
数据对象是性质相同的数据元素的集合,是数据的一个子集。例如,大写字母就是一个数据对象,大写字母数据对象是集合{‘A’, ‘B‘, ... , ‘Z‘}。在数据结构中数据通常指的是数据对象。
数据结构是指相互之间存在某种关系的数据元素的集合,数据结构中的关系主要是指相邻关系。数据结构包括三方面内容:逻辑结构、存储结构和对数据的运算。
数据结构的形式化定义数据结构是一个二元组:数据结构DS=(D, R),其中,D是数据元素的有限集,R是D上关系的有限集。例子见《新编数据结构习题与解析》。
数据的逻辑结构是指数据结构定义中的“关系”,描述的是数据元素的逻辑关系,它与数据的存储结构无关,同一逻辑结构可以对应多种存储结构。归纳起来,数据的逻辑结构主要有三大类:
(1)线性结构
线性结构是指该结构中的元素之间存在一对一的关系。其特点是开始元素和终端元素都是唯一的,除此之外,其余每个元素都有且仅有一个前驱元素和一个后继元素。线性表就是一种典型的线性结构。
(2)树形结构
树形结构是指该结构中的元素之间存在一对多的关系。只有一个元素为开始元素(也称为根节点),可以有多个终端元素,每个元素有零个或多个后继元素,除开始元素外每个元素只有一个前驱元素。
(3)图形结构
图形结构是指该结构中的元素之间存在多对多的关系,每个元素可以有多个前驱元素和多个后继元素。
树形结构和图形结构统称为非线性结构。
数据的物理结构又称存储结构,是数据的逻辑结构在计算机中的存储形式(又称映像)。它包括数据元素的表示和关系的表示。当数据元素是由若干数据项构成时,数据项的表示称为数据域。
数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像。对应的两种不同的存储结构分别是顺序存储结构和链式存储结构。
顺序映像是借助数据元素在存储器中的物理位置来表示数据元素之间的逻辑关系;非顺序映像是借助指针(指示数据元素的存储地址)表示数据元素之间的逻辑关系。实际上,在数据结构中有以下4种常用的存储方法:
(1)顺序存储方法
该方法是把数据元素存放在地址连续的存储单元里,逻辑上相邻的元素其存储的物理位置也相邻,数据元素之间的逻辑关系和物理关系是一致的。由此得到的存储表示称为顺序存储结构,通常顺序存储结构是借助于计算机程序设计语言的数组来描述的。
(2)链式存储方法
该方法是把数据元素存放在任意的存储单元里,不要求逻辑上相邻的节点在物理位置上亦相邻,节点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,通常要借助于计算机程序设计语言的指针类型来描述它。
(3)索引存储方法
该方法通常是在存储节点信息的同时,还建立附加的索引表。索引表中的每一项称为索引项,索引项的一般形式是:(关键字,地址),关键字唯一标识一个节点,地址作为指向节点的指针。这种带有索引表的存储结构可以大大提高数据查找的速度。
(4)散列(或哈希)存储方法
该方法的基本思想是根据节点的关键字,通过哈希函数直接计算出该节点的存储地址。这种存储方法从本质上讲是顺序存储方法和链式存储方法的扩展。
一个数据结构所包含的数据运算的种类和个数以及每种运算中的参数个数和类型,都应依据数据结构的实际用途和需要来设定。它们只有在一定的存储结构上具体实现之后才有真实意义,所以数据运算的实现和执行效率都与存储结构有关。
数据类型是一个值的集合和定义在这个值集上的一组操作的总称。例如,C语言中的int是一种整型数据类型,int型变量的取值为某个区间上的整数(例如在16位机上的区间为-32768~32767),定义在其上的操作为加、减、乘、除等运算。
抽象数据类型(ADT)是指一个数据模型以及定义在该模型上的一组操作。ADT通常由用户定义,用以表示应用问题的数据的数据模型,ADT由基本数据类型组成,并包括一组相关的操作。其特征是使用与实现分离,实现封装和信息隐藏,也就是说,在ADT设计时,把类型的声明与其实现分离开来。
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。
(1)有穷性
一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。也就是说,一个算法对于任意一组合法输入值,在执行有穷步骤之后一定能结束。
(2)确定性
对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径。
(3)可行性
算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之。
(4)有输入
作为算法加工对象的量值,通常体现为算法中的一组变量。有些输入量需要在算法执行过程中输入,而有的算法表面可以没有输入,实际上已经嵌入算法之中。
(5)有输出
它是一组与“输入”有确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法的功能。
注:算法和程序不同,程序可以不满足有穷性。例如,一个操作系统在用户未操作之前一直处于“等待”的循环中,直到出现新的用户操作为止。一般的程序都不会出现这种情况,所以在很多情况下对算法和程序这两个术语不加以严格区分。
算法描述采用自然语言或某种计算机语言给出算法的指令序列。
(1)正确性
(2)可使用性
(3)可读性
(4)健壮性
要求算法具有很好的容错性,即提供异常处理,能够对不合理的数据进行检查。不经常出现异常中断或死机现象。
(5)高效率和低存储量需求
算法效率通过算法时间复杂度和空间复杂度来描述。
算法时间复杂度以算法中基本操作重复执行的次数(简称为频度)作为算法的时间度量。一般不必精确计算出算法的时间复杂度,只要大概计算出相应的数量级即可,如O(1)、O(n)等。
O的形式定义为:若f(n)是正整数n(n表示问题规模)的一个函数,则T(n)=O(f(n))表示存在一个正的常数M,使得当n>=n0时满足|T(n)|<=M*|f(n)|。换句话说,O(f(n))给出了函数f(n)的上界。
当算法时间复杂度T(n)与n无关时,T(n)=O(1);当算法时间复杂度T(n)与n为线性关系时,T(n)=O(n);依此类推。一般地,常用的时间复杂度有如下关系:
O(1)<=O(log2n)<=O(n)<=O(nlog2n)<=O(n2)<=O(n3)<=…<=O(nk)<=O(2n)
求解方法归纳:
1)确定问题规模n:通常在形参中给出。
2)计算算法中的语句频度T(n):通常以算法中的基本运算(若有循环,循环中最深层的语句为基本运算)为核心,求出其执行的次数。
3)用大O表示:只保留T(n)的最高阶项,如果这个最高阶项的序数不为1,除去这个序数。
它是算法所需存储空间的度量,主要考虑在算法运行过程中临时占用的存储空间的大小,一般以数量级的形式给出。
一个算法的临时存储空间是指函数体内新开辟的空间,不包括形参占用的空间。如:
1 // 函数体内开辟了i,s变量的空间,与n无关,所以空间复杂度为O(1), 2 // 不计形参a占用的空间。 3 int fun(int a[], int n) 4 { 5 int i, s = 0; 6 for (i = 0; i < n; i++) 7 { 8 s += a[i]; 9 } 10 return s; 11 }
数据结构基本概念及算法和算法分析 -- 引自《新编数据结构习题与解析》(李春葆等著)
标签:
原文地址:http://www.cnblogs.com/xiehongfeng100/p/4415883.html