数据结构与算法总结

这几天又认真看了一遍《大话数据结构》和《数据结构-C语言版》,本文结合自己的理解写的笔记,数据结构的代码调试好后会在后续的博文中进行详细介绍。

【1】数据结构(Data Structure)

数据结构 + 算法 = 程序
综上所述,数据结构主要是研究非数值性程序设计中计算机操作的对象(数据)及其相互间关系和运算的学科。

有人认为:按照某种逻辑关系组织起来的一批数据,应用计算机语言,按照一定的存取方式把它们存储到计算机存储器中,并为这些数据定义一个运算集合,就称为一个数据结构。

数据结构与算法总结_第1张图片

    1、数据:基本数据类型、构造数据类型
        数据即信息的载体,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。
        数据元素(Data Element)
        数据元素是数据的基本单位,又称之为记录。一般由若干基本项(或称字段、域、属性)组成。
        数据类型(Data Type)是对数据元素取值范围与运算的限定。
    2、结构:指数据之间的相互关系
       1> 逻辑结构:是从具体问题中抽象出来的数学模型
        线性结构:一个对一个,如线性表、栈、队列
        集合    :数据元素间除“同属于一个集合”外,无其它关系
        树形结构:一个对多个,如树
        图状结构:多个对多个,如图
//知识点
线性结构:一个对一个,如线性表、链表、栈、队列
************线性表****************
【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

       2> 存储结构:数据的存储结构指的是数据的逻辑结构在计算机存储器中的映象(或表示)
        顺序:借助元素在存储器中的相对位置来表示数据元素间的逻辑关系
        链式:借助指示元素存储地址的指针表示数据元素间的逻辑关系
        索引:在存储数据的同时,建立一个附加的索引表,即索引存储结构=数据文件+索引表。
        散列:根据数据元素的特殊字段(称为关键字key),计算数据元素的存放地址,然后数据元素按地址存放,所得到的存储结构为散列存储结构(或Hash结构)。
顺序:借助元素在存储器中的相对位置来表示数据元素间的逻辑关系
优点 : 方便遍历访问 可以同时处理多个类型一致的数据。
缺点 : 创建的时候必须声明大小,内存连续不方便插入删除。

链式:借助指示元素存储地址的指针表示数据元素间的逻辑关系
优点 : 需要多少空间就申请多少 ,内存中不连续方便插入删除。
缺点 : 引入了指针,遍历等操作复杂度有所提升。

索引:在存储数据的同时,建立一个附加的索引表,即索引存储结构=数据文件+索引表。 
优点 : 用结点的索引号来确定结点存储地址,检索速度快。
缺点 : 增加了附加的索引表,会占用较多的存储空间。

散列:根据数据元素的特殊字段(称为关键字key),计算数据元素的存放地址,然后数据元素按地址存放,所得到的存储结构为散列存储结构(或Hash结构)。
优点 :如果关键字已知则存取速度极快,插入快。
缺点 : 删除慢,如果不知道关键字则存取很慢,对存储空间使用不充分。

【2】算法(Algorithm)
    1.算法的定义
      算法是一个有穷规则(或语句、指令)的有序集合。它确定了解决某一问题的一个运算序列。对于问题的初始输入,通过算法有限步的运行,产生一个或多个输出。
    2、数据结构与算法
      算法设计:  取决于选定的逻辑结构
      算法实现: 依赖于采用的存储结构
    3、算法的特性
       有穷性 —— 算法执行的步骤(或规则)是有限的;
       确定性 —— 每个计算步骤无二义性;
       可行性 —— 每个计算步骤能够在有限的时间内完成;
       输   入 —— 算法有一个或多个外部输入;
       输   出 —— 算法有一个或多个输出。
    4、算法分析
       解决一个问题可以有多种不同的算法,在算法正确的前提下,评价算法好坏的方法 :
       1、消耗时间的多少 ;
       2、消耗存储空间的多少(以空间换时间) ;
       3、容易理解、容易编程和调试、容易维护;
       4、问题的规模 :输入数据量的大小,用n来表示;
       5、算法的时间复杂度 :算法消耗时间,它是问题规模的函数 T(n)。
       6、应用
           1、查找算法 http://blog.csdn.net/u010872301/article/details/78471381
           2、排序算法 http://blog.csdn.net/u010872301/article/details/78471927
【3】总结
1、数据的逻辑结构、数据的存储结构及数据的运算关系?
这三方面是一个整体的关系。比如:线性表是一种逻辑结构,若采用顺序方法的存储表示,可称其为顺序表;若采用链式存储方法,则可称其为链表;若采用散列存储方法,则可称为散列表。数据的运算也是数据结构不可分割的一个方面。在给定了数据的逻辑结构和存储结构之后,按定义的运算集合及其运算的性质不同,也可能导致完全不同的数据结构。若对线性表上的插入、删除运算限制在表的一端进行,则该线性表称之为栈;若对插入限制在表的一端进行,而删除限制在表的另一端进行,则该线性表称之为队列。更进一步,若线性表采用顺序表或链表作为存储结构,则对插入和删除运算做了上述限制之后,可分别得到顺序栈或链栈,顺序队列或链队列。
2、设计思路?
确定数据逻辑存储关系和运算 -----》 设计数据模型 ----》编写功能代码

你可能感兴趣的:(Machine,Learning)