数值计算的特点是数据类型简单,算法复杂,所以更侧重于程序设计的技巧。非数值计算的特点是
数据之间的关系复杂,数据量庞大。程序设计的实质是对确定的问题进行数据分析,选择一种好的
数据结构,设计一种好的算法。
数据的逻辑结构是抽象的,是指数据元素之间的内在联系。逻辑结构包括集合结构(集合中的数据
元素除了同属于一个集合以外,无任何其他关系),线性结构(线性结构的数据元素之间存在着一
对一的线性关系),树形结构(树形结构的数据元素之间存在着一对多的层次关系),图状结构
(图状结构的数据之间存在着多对多的任意关系)。
存储结构又被称为物理结构,是逻辑结构在计算机中的实现,两者综合起来构成数据元素之间的结
构关系。
常用的存储结构包括两种:顺序存储结构(逻辑上相邻的数据元素存储在物理位置相邻的存储单元
中,数据元素之间的逻辑关系和物理关系是一致的)和链式存储结构(不要求逻辑上相邻的数据元
素物理位置也相邻,数据元素可以存储在任意存储单元中,数据元素之间的逻辑关系通过存储单元
的地址来表示——地下工作的单线联系就是现实案例)。
线性结构描述的是一对一的线性关系,即一个线性结构中除第一个元素之外,其他每个元素只有一
个直接前驱;除最后一个元素外,其他每个元素只有一个直接后继。
线性结构包括线性表(由性质相同的一批数据元素构成的有限数据。几乎所有数据的集合都可以看
作线性表。线性表中的数据元素之间有逻辑上的先后关系),栈(具有一定操作约束的线性表,只
能在栈一端进行插入和删除操作,具有后进先出的特性。栈的基本操作主要有入栈和出栈。在进行
入栈操作时,在栈顶位置增加一个元素;在进行出栈操作时,只有栈顶位置的元素才能出栈。栈的
后进先出的特性意味着栈为存储某些数据元素提供了一种理想的数据结构,栈通常是回溯活动的基
础。栈非常重要的一个应用是在程序设计语言中来实现函数的调用),队列(具有一定操作约束的
线性表,只能在队列的一端进行插入操作,在另一端进行删除操作。具有先进先出的特性。队列的
基本操作主要有入队列和出队列。在进行入队列操作时,在队尾增加一个新元素;在进行出队列操
作时,删除队头元素),字符串,数组等,期中线性表是最基本的线性结构。
层次结构叫作树形结构,表示一对多的关系,即一个节点最多有一个直接前驱,可以有多个直接后
继。
树:在一棵树中,如果各子树之间是有先后次序的,则称该树为有序树,否则称该树为无序树。如
果节点组成了多棵互不相交的树,则构成一片森林。
二叉树:二叉树是一棵有序树,每个节点中至多有两棵子树。这两棵子树有左右之分,其次序不能
任意颠倒,位于左边的子树称为左子树,位于右边的子树称为右子树,左,右子树均为二叉树。二
叉树具有五种基本形态。
如果有一棵二叉树,其每个分支节点都有左,右两棵子树,则称其为一棵满二叉树。如果有一棵深
度为k,节点个数为n的二叉树,按照从上到下,同一层从左到右的顺序对节点逐层进行编号,其节
点1~n的位置序号分别与满二叉树的节点1~n的位置序号一一对应,则称改二叉树为完全二叉树。
通常采用链式存储结构,设有两个指针域,存放左右两个孩子节点,这种存储方式称为二叉链表。
二叉树的遍历:线序遍历(DLR)——若二叉树为空,则操作为空,否则依次执行如下三个操作:
访问节点,按先序遍历其左子树,按先序遍历其右子树,中序遍历(LDR)——若二叉树为空,则
操作为空,否则依次执行如下三个操作:按中序遍历左子树,访问根节点,按中序遍历右子树,后
序遍历(LRD)——若二叉树为空,则操作为空,否则依次执行如下三个操作:按后序遍历左子
树,按后序遍历右子树,访问根节点三种遍历方法。均为递归的操作思想。按层次历遍:按照从上
到下,同一层从左到右的顺序来进行编号。在进行按层次遍历时,需要考虑如何保证访问顺序的正
确性问题,这里需要用到一个辅助的数据结构,即队列。
如果图中的每条边都是有方向的,则称该图为有向图,有向图中的边也被称为弧,是由两个顶点构
成的有序对,通常用尖括号表示。如果图中的每条边都是没有方向的,则称该图为无向视图,无向
视图中的边均为顶点的无序对,通常用圆括号表示。如果一个无向视图中任意两个顶点之间都有
边,则称该图为无向完全视图。在一个含有n个顶点的无向完全图中,有n(n-1)/2条边。如果一个有
向图中任意两个顶点之间都有方向相反的两条弧,则称该图为有向完全图。在一个含有n个顶点的
有向完全图中,有n(n-1)条弧。如果在图的边或弧上通过数字表示与该边相关的数据信息,则这个
数据信息就称为该边的权。边或弧上带权的图称为网。
图的遍历是指从图中某个顶点出发访问图中的每个节点,且每个顶点仅被访问一次。图的遍历是求
解图的连通性问题,拓扑排序,求关键路径等的基础。
两种遍历方法:深度优先搜索和广度优先搜索。遍历的目的是寻找合适的顶点,相对而言,深度优
先搜索更适用于目标比较明确,以找到目标为主的目的的情况,而广度优先搜索更适用于在不断扩
大遍历范围时找到相对最优解的情况。最小生成树。
Dijkstra算法的基本思想--用于计算从一个节点到其他所有节点的最短路径。该算法按路径长度递增
次序,以起始点为中心向外层扩展,直到扩展到终点为止。“程序结构设计之父”——Dijkstra。