以前接触数据结构感觉它很难,很抽象,不知道从何入手,这次复习,把数据结构细化分析复习,将数据结构拆分为。通过几天的学习开始对数据结构有初步的了解。
数据结构师计算机村粗、组织数据的方式,数据机构是指相互之间存在的一种或者多种特定的关系的数据元素的集合。
学习数据结构有什么用那?
对数据结构熟练掌握之后,如果设计出好的数据结构就可以为你的程序带来更高的运行和存储效率,数据结构通常涉及的是检索方法和索引技术以及一些算法。当然小型的系统当然不会涉及到数据结构,但是如果在设计大型系统的时候,我们就要为系统设计良好数据结构,学好数据结构是成为大师的基础。
其中,数据是客观事物的表示,在计算机中是指能输入到计算机并被计算机处理的集合,数据元素是指数据的基本单位,在计算机中通常作为一个整体考虑和处理。数据项是数据不可分割的最小单位(数据元素由多个数据项组成。)。而,数据结构就是数据元素相互之间存在的一种或多种的数据元素集合。
数据结构分为:
1,数据逻辑结构:即是数据之间的相互关系,分为四大类:有线性结构、树形结构、图状机构、集合。
2,数据的存储结构:又称屋里结构,有顺序存储结构、链式存储结构。
3,数据运算
数据的逻辑结构和存储结构师密切相关的两方面,任何一个算法的设计取决于选定的数据逻辑结构,而算法的实现依赖于采用的存储结构。
一.线性结构:线性表是最简单、最常用的一种数据结构,它是由n个相同数据类型的结点组成的有限序列。
1.线性表最重要的性质是线性表中结点和相对位置是确定的。有多种存储方式能将线性表存储在计算机内,其中最常用的是顺序存储和链式存储。
(1)线性表的链式存储
链式存储是指:用结点来存储数据元素,结点的空间可以是连续的也可以是不连续的,因此存储数据元素的同时必须存储元素之间的逻辑关系,结点空间只有在需要的时候才申请,无需事先分配。
(2)线性表的顺序存储
是指用一组连续的存储单元一次存储线性表中的数据元素,从而使得逻辑关系相邻的两个元素在物理上位置也相邻,这种存储方式下,逻辑关系无需占用额外的存储空间,有点是可以随机存取表中的元素,缺点是插入和删除操作要移动元素。
顺序和链式存储的比较:
(1),时间的角度考虑,在按位置查找数据或在查找元素的前驱和后继方面,顺序存储有着较大的优势,在插入,删除数据时,链式存储有着较大的优势,这是由于在链表中只需要修改指针即可实现这些操作,而顺序表中进行插入和删除时,需要移动表中的数据。
(2),从空间的角度上来讲顺序表的存储空间是静态分配的,在程序执行之气必须规定器存储模式,而动态表存储空间是动态分配的,只要存储空间有空闲就不会溢出。
2.线性结构存储有线性表、栈、队列、字符串、数组等特殊线性表的形式来使用的,
(1),线性表是一类最简单、最常用的数据结构,简单的说,一个线性表是由n个元素有限序列,特点是出第一个元素外,集合中的每个元素均有一个直接前驱,除最后一个元素外,集合中的每个元素均只有一个直接后继。
(2).栈:是限定只能在表的一端进行插入和删除操作的线性表。
它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。 插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为先进后出表。
(3).队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。
二,树形结构:树形结构树型结构是一类重要的非线性数据结构,直观看来,树是以分支关系定义的层次结构,树是由n个结点的有限集合,n为0时为空树。树结构的特点是:它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前驱。以下具体地给出树的定义及树的数据结构表示。
1.二叉树,二叉树是一个连通的无环图,并且每一个顶点的度不大于2。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点
(1)、完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层有叶子节点,这就是完全二叉树。
(2)、满二叉树——除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树,。
二叉树的遍历: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。分为前序遍历、中序遍历和后续遍历。
2,哈弗曼树(最优二叉树):给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。
3.线索二叉树: n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(ThreadedBinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
注意:线索链表解决了二叉链表找左、右孩子困难的问题,出现了无法直接找到该结点在某种遍历序列中的前趋和后继结点的问题。
4.平衡二叉树(Balanced Binary Tree)又被称为AVL树(区别于AVL算法,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法
5.完全二叉树:完全二叉树的定义:深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为完全二叉树。
特点:叶子结点只可能在层次最大的两层上出现;对任一结点,若其右分支下子孙的最大层次为l,则其左分支下子孙的最大层次必为l 或l+1
6.满二叉树:满二叉树:一棵深度为k,且有2的(k)次方-1个节点的二叉树
特点:每一层上的结点数都是最大结点数,满二叉树肯定是完全二叉树
完全二叉树不一定是满二叉树
三,图 图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
1.最常用的图的结构有邻接矩阵和邻接表。
2.图的遍历有:深度优先遍历和广度优先遍历。
深度优先就是:类似于树的前序遍历,对于无向图,如果是联通的,那么按深度 优先遍历时,课遍历全部顶点,得到全部顶点的一个遍历序列,如果遍历序列没有包含所有顶点那么该图是不连通的。
广度优先遍历:是指首先顶点v然后,访问与顶点v相邻接的全部未被访问过得顶点,以此类推,直至图的所有顶点都被访问过一遍为止。
3.最小生成树:含有n个顶点的连通图的生成树有n个顶点和n-1条边,对一个带权的图在一棵生成树中,各条边的权值之和称为这棵树的代价,其中代价最小的生成树,为最小代价树,简称最小生成树。
4.最短路径:带权图的最短路径问题即是求两个顶点之间长度最短的路径,其中路径长度不是值路径上的边数的总和而是指路径上的权值总和,路径长度的具体含义取决于边上权值所代表的意义。
5.拓扑排序:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。
(1)、在有向图中选一个没有前驱(入度为零)的顶点且输出。
(2)、从图中删除该顶点以及它发出的弧(这样就得到别的入度为0的顶点)
例如:在现实生活中,也会有不少应用例子,比如学校课程布置图,要先修完一些基础课,才可以继续修专业课。或者在一些大型项目中一些项目实行存在先后顺序,这样就会用到拓扑排序。
6.关键路径:关键路径是项目管理中进度控制的一个术语,在项目管理中,关键路径是指网络终端元素的元素的序列,该序列具有最长的总工期并决定了整个项目的最短完成时间。
(1) 关键路径是项目网络图中最长的路径,他决定了项目的总耗时时间;
(2) 项目经理必须把注意力集中在那些优先等级较高的任务,确保他们准时完成,关键路径上任何活动的推迟都将导致整个项目推迟;
(3) 给关键路径要时间,向非关键路径要资源;
(4) 调整进度,平衡资源。