数据结构(C)
1.1什么是数据结构?
尼古拉斯教授提出了算法+数据结构=程序的知名公式。
这说明数据结构和算法与程序之间的联系是十分密切的,要想弄明白什么是数据结构,我们就必须要搞清楚其中的一些核心概念。
程序:一组计算机能够识别和执行的指令(语句),每一条指令执行特定的操作·。
算法: 对特定问题求解步骤的一种描述,他是指令的有限序列,其中每一条指令表示一个或多个操作。
数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。(数据结构(C语言版)(第2版)严蔚敏)
那简单的来说数据结构就是组织和存储数据以有效执行所需操作的方法。
1.2如何组织和存储数据
1、懂数据之间的逻辑结构。
数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,可以看作是从具体问题抽象出来的数学模型。
数据的逻辑结构有两个要素:一是数据元素;二是关系。
根据数据元素之间关系的不同特性,通常有四类基本结构,如图所示。
(1)集合结构数据元素之间除了“属于同一集合”的关系外,别无其他关系。(2)线性结构数据元素之间存在一对一的关系。
(3)树结构数据元素之间存在一对多的关系。
(4)图结构或网状结构数据元素之间存在多对多的关系。
线性结构包括:
线性表(典型的线性结构)、栈和队列(具有特殊限制的线性表,数据操作只能在表的一端或两端进行)、字符串(也是特殊的线性表,其特殊性表现在它的数据元素仅由一个字符组成)、数组(是线性表的推广,它的数据元素是一个线性表)、广义表(也是线性表的推广,它的数据元素是一个线性表,但不同构,即或者是单元素,或者是线性表)。
非线性结构包括:
树(具有多个分支的层次结构)和二叉树(具有两个分支的层次结构)、
有向图(一种图结构,边是顶点的有序对)和无向图(另一种图结构,边是顶点的无序对)。
这几种逻辑结构可以用一个层次图描述,如图所示。
2.数据如何在计算机中存储
数据对象在存储到计算机时,通常要求既要存储各数据元素的数据,又要存储数据元素之间的逻辑关系,数据元素在计算机内用一个结点来表示。数据元素在计算机中有顺序存储结构和链式存储结构两种基本的存储结构。
(1)顺序存储结构
顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,要求所有的元素依次存放在一片连续的存储空间中,故通常借助程序设计语言的数组类型来描述。
(2)链式存储结构
链式存储结构,无需占用一整块存储空间。但为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址。所以链式存储结构通常借助于程序设计语言的指针类型来描述。
1.3算法和算法分析
1、一个有效的算法一定以下符合五大特性:
确定性:每一步定义都是确切、无歧义的;
有穷性:算法应在执行有穷步后结束;
有效性:每一条运算应足够基本;
输入:有零个或多个输入;
输出:有一个或多个输出(处理结果)
分析一个算法是否成功,不仅仅取决于它是否能够满足产生预期的结果还与它所占用的时间与空间资源有关。
2、时间复杂度(T(n)—根据算法写成的程序在执行时耗费时间的长度)
一般情况下,算法中基本操作重复执行的次数是问题规模 n某个的函数f(n),算法的时间量度记作T(n)= O (f(n)),它表示随问题规模 n的增大,算法执行时间的增长率和f(n)的增长率相同(同阶)。
时间复杂度分析:
3、空间复杂度(S(n)—根据算法写成的程序在执行时占用存储单元的长度)
算法的空间量度记作S(n)=O (g(n))。
存储空间的固定部分:
程序指令代码的空间,常数、简单变量、定长成分(如数组元素、结构成分、对象的数据成员等)变量所占的空间。
存储空间的可变部分:
程序与实例特性有关的成分变量所占空间、引用变量所占空间、递归栈所用的空间、通过new和delete命令动态使用的空间。
1.4 抽象数据类型
1、数据结构的形式描述
数据结构是一个二元组Data Structure =(D, S)
其中:D是数据元素(即值)的有限集,即D={d(i) l i= 1,2,… n, n ≥ 0};
S是D上关系的有限集,即S={r(j)= 1,2,… k,k ≥ 1},
其中,r(j)是定义在D上的一个二元关系,={<d(j), d(k)> lj, k = 1, 2,… n , j≠ k}。
如图为一元N次多项式的形式描述:
2、抽象数据类型
数据类型: 一个值的集合(数据结构)和定义在这个值集上的一组操作的总称。
抽象数据类型可用三元组表示:ADT=(D,S, P)
其中:D是数据对象,S是D上的关系集,P是对D的基本操作集。
如图是抽象数据类型的格式定义:
如图为多项式的抽象数据类型定义