这几天又认真看了一遍《大话数据结构》和《数据结构-C语言版》,本文结合自己的理解写的笔记,数据结构的代码调试好后会在后续的博文中进行详细介绍。
【1】数据结构(Data Structure)
数据结构 + 算法 = 程序有人认为:按照某种逻辑关系组织起来的一批数据,应用计算机语言,按照一定的存取方式把它们存储到计算机存储器中,并为这些数据定义一个运算集合,就称为一个数据结构。
//知识点
线性结构:一个对一个,如线性表、链表、栈、队列
************线性表****************
【1】概念 线性表是信息表的一种形式,表中数据元素之间满足线性关系(或线性结构),是一种最基本、最简单的数据结构类型。
【2】线性表的特征:
1) 对非空表,a0是表头,无前驱;
2) an-1是表尾,无后继;
3) 其它的每个元素ai有且仅有一个直接前驱(ai-1)和一个直接后继(ai+1)
【3】具体实现
增、删、改、查
【4】线性表的顺序存储的优缺点
线性表的顺序存储结构有存储密度高及能够随机存取等优点,但存在以下不足:
(1)要求系统提供一片较大的连续存储空间。
(2)插入、删除等运算耗时,且存在元素在存储器中成片移动的现象;
【5】应用
1)一步一步求解约瑟夫(Joseph)问题 http://blog.csdn.net/w57w57w57/article/details/6639194
***********栈**************
【1】概念
栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈),
允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈
中没有元素时称为“空栈”。
【2】特点 :后进先出(LIFO)。
【3】栈的实现
顺序栈
创建一个空的栈(stack)
判断栈是否为空
判断栈是否为满
入栈(压栈)
出栈(弹栈)
打印
链式栈
创建一个空的栈(stack)
判断栈是否为空
入栈(压栈)
出栈(弹栈)
打印
【4】应用
1)四则运算表达式求值(栈的应用)http://www.cnblogs.com/lcplcpjava/p/6576935.html
***************队列******************
【1】概念 队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”,
允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。
【2】特点 :先进先出(FIFO)。
【3】实现
循环队列
创建一个空的队列(sequeue)
判断队列是否为满
判断队列是否为空
出队
入队
【4】应用
1)球钟问题的解决--栈和队列 http://blog.csdn.net/createchance/article/details/17466053
树形结构:一个对多个,如树
***************树和二叉树*************
【1】概念
树(Tree)是n(n≥0)个节点的有限集合T,它满足两个条件 :
有且仅有一个特定的称为根(Root)的节点;
其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,
其中每一个集合又是一棵树,并称为其根的子树(Subtree)。
【2】度数
一个节点的子树的个数称为该节点的度数,
一棵树的度数是指该树中节点的最大度数。
【3】路径
一个节点系列k1,k2, ……,ki,ki+1, ……,kj,并满足ki是ki+1的父节点,
就称为一条从k1到kj的路径,路径的长度为j-1,即路径中的边数。
【4】层数
节点的层数等于父节点的层数加一,根节点的层数定义为一。
树中节点层数的最大值称为该树的高度或深度。
【5】树的逻辑结构
树中任何节点都可以有零个或多个直接后继节点(子节点),
但至多只有一个直接前趋节点(父节点),根节点没有前趋节
点,叶节点没有后继节点。
【6】二叉树的定义
二叉树(Binary Tree)是n(n≥0)个节点的有限集合,
它或者是空集(n=0),或者是由一个根节点以及两棵互不相交的、
分别称为左子树和右子树的二叉树组成。二叉树与普通有序树不同,
二叉树严格区分左孩子和右孩子,即使只有一个子节点也要区分左右。
【7】二叉树的性质
二叉树第i(i≥1)层上的节点最多为2i-1个。
深度为k(k≥1)的二叉树最多有2k-1个节点。
在任意一棵二叉树中,树叶的数目比度数为2的节点的数目多一。
总节点数为各类节点之和:n = n0 + n1 + n2
总节点数为所有子节点数加一:n = n1 + 2*n2 + 1
故得:n0 = n2 + 1 ;
满二叉树 :深度为k(k≥1)时有2k-1个节点的二叉树。
完全二叉树 :只有最下面两层有度数小于2的节点,且最下面一层的叶节点集中在最左边的若干位置上。
【8】二叉树的存储
完全二叉树节点的编号方法是从上到下,从左到右,根节点为1号节点。
设完全二叉树的节点数为n,某节点编号为i
当2*i≤n时,有左孩子,其编号为2*i ,否则没有左孩子,本身是叶节点;
当2*i+1≤n时,有右孩子,其编号为2*i+1 ,否则没有右孩子;
如果根节点为0号,则需要使用2*i+1判断左,2*i+2判断右
【9】二叉树的遍历
由于二叉树的递归性质,遍历算法也是递归的。三种基本的遍历算法如下 :
先序遍历:先访问树根,再访问左子树,最后访问右子树; 根 左 右
中序遍历:先访问左子树,再访问树根,最后访问右子树; 左 根 右
后序遍历:先访问左子树,再访问右子树,最后访问树根; 左 右 根
【10】应用
1)【数据结构与算法】Huffman树&&Huffman编码(附完整源码)http://blog.csdn.net/w57w57w57/article/details/6639194
图状结构:多个对多个,如图
************图***************
【1】概念 任意的两个元素都可能相关,即图中任一元素可以有若干个直接前驱和直接后继,
属于网状结构类型。
图(Graph)是一种非线性数据结构
【2】有向图(Digraph)
设 Vi、Vj为图中的两个顶点,若关系< Vi,Vj >存在方向性,称之为有向图,记为< Vi,Vj >Vi为弧尾,Vj为弧头
【3】无向图(Undigraph)
设Vi、Vj为图中的两个顶点,若关系无方向性,称之为无向图,记作(Vi,Vj)
【4】网(Network)
若在图的关系或(Vi,Vj)上附加一个值w,
称w为弧或边上的权。带权的图称为网。
权w的具体含义视图在不同领域的应用而定,如顶点表示城市,权w可以为两个城市间的距离等等。
【5】顶点的度(Degree)
对于无向图来说,顶点的度等于与之直接相连的顶点的个数(边的条数)
对于有向图来说,顶点的度等于出度加入度
【6】路径(Path)
若从顶点V出发,经过某些顶点能到达另一顶点V',则称V与V'之间存在一条路径。
若路径(Vi1,Vi2,……,Vim)中顶点不重复出现,则称其为简单路径;
若路径中只有第一顶点Vi1与最后一个顶点Vim相同,则称其为简单回路或简单环(Cycle)。
【7】图的遍历
图的遍历是树的遍历的推广,是按照某种规则(或次序)访问图中各顶点一次且仅一次的操作,
亦是将网状结构按某种规则线性化的过程。
由于图存在回路,为区别一顶点是否被访问过和避免顶点被多次访问,在遍历过程中,应记下每
个访问过的顶点,即每个顶点对应有一个标志位,初始为False,一旦该顶点被访问,就将其置为True,
以后若又碰到该顶点时,视其标志的状态,而决定是否对其访问。
对图的遍历通常有“深度优先搜索”和“广度优先搜索”方法,二者是人工智能(AI)的一个基础。
【8】深度优先搜索(Depth First Search,简称DFS)
类似树的先根遍历。设初始时,图中各顶点均未被访问,从图中某顶点(设为V0)出发,访问V0,
然后搜索V0的一个邻接点Vi,若Vi未被访问,则访问之,再搜索Vi的一个邻接点(深度优先)……。
若某顶点的邻接点全部访问完毕,则回溯(Backtracking)到它的上一顶点,然后再从此顶点又按
深度优先的方法搜索下去,……,直到能访问的顶点都访问完毕为止。
【9】广度优先搜索(Breadth First Search),简称BFS
类似树的按层次遍历。初始时,图中各顶点均未被访问,从图中某顶点(设V0)出发,访问V0,
并依次访问V0的各邻接点(广度优先)。然后,分别从这些被访问过的顶点出发,仍按照广度优先的
策略搜索其它顶点,……,直到能访问的顶点都访问完毕为止。
为控制广度优先的正确搜索,要用到队列技术,即访问完一个顶点后,让该顶点的序号进队。然
后取相应队头(出队),考察访问过的顶点的各邻接点,将未访问过的邻接点访问后再依次进队,……,
直到队空为止。
【10】应用
1)最短路径—Dijkstra算法和Floyd算法 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html
顺序:借助元素在存储器中的相对位置来表示数据元素间的逻辑关系
优点 : 方便遍历访问 可以同时处理多个类型一致的数据。
缺点 : 创建的时候必须声明大小,内存连续不方便插入删除。
链式:借助指示元素存储地址的指针表示数据元素间的逻辑关系
优点 : 需要多少空间就申请多少 ,内存中不连续方便插入删除。
缺点 : 引入了指针,遍历等操作复杂度有所提升。
索引:在存储数据的同时,建立一个附加的索引表,即索引存储结构=数据文件+索引表。
优点 : 用结点的索引号来确定结点存储地址,检索速度快。
缺点 : 增加了附加的索引表,会占用较多的存储空间。
散列:根据数据元素的特殊字段(称为关键字key),计算数据元素的存放地址,然后数据元素按地址存放,所得到的存储结构为散列存储结构(或Hash结构)。
优点 :如果关键字已知则存取速度极快,插入快。
缺点 : 删除慢,如果不知道关键字则存取很慢,对存储空间使用不充分。