美文网首页
Data Structure Summary

Data Structure Summary

作者: RoseauHan | 来源:发表于2018-02-28 17:50 被阅读15次

此篇博客为数据结构的学习笔记总结,主要整理了一些重点考察内容。掌握程度主要分为以下三部分 一:背诵理解概念 二:掌握原理及运用 三:掌握算法及其设计;
博客末尾提供了PDF版的下载地址。
date: 2018-01-05 00:00:00
©RoseauHan

掌握程度主要分为以下三部分

一:背诵理解概念

二:掌握原理及运用

三:掌握算法及其设计

( 博客末尾提供了PDF版的下载地址。)

第一章 绪论

一、数据结构等

  • 数据结构:给定数据对象及其上面的定义的操作(运算、关系)所形成的系统。

  • 数据结构研究的内容:数据的逻辑关系、存储(物理)关系、运算关系。

  • 常见的逻辑关系:线性结构、非线性结构(树、图)

  • 常见的物理关系:顺序结构、链接结构、索引结构、散列结构。

  • 数据结构评价的主要标准:时间效率(时间复杂度)、存储需要量(空间复杂度)


第二章 算法概述

一、算法描述、有效算法等

  • 算法:解决某个问题的指令的有限指令集合,符合 “有穷性、确定性、可行性、输入输出” 等准则。

  • 算法常见的描述方法:具体程序设计语言、自然语言、PDL语言、流程图。

  • 算法设计准则:正确性、易读性、健壮性、高效性。

  • 有效算法:以多项式时间为界限的算法称有效算法。


第三章 线性表

一、链表、静态链表等

  • 线性表:一个线性表是n≥0个数据元素a1,a2,……,an的有限序列,序列中除第一个和最后一个以外,每个元素都有且仅有一个直接前趋和直接后继。

  • 链表:通过指针联系起来的结点的整体。

  • 表头结点:增加一个附加结点,放置于链表的最前面,也称头结点。

  • 静态链表:以整型变量的值作为存储链表指针值(即地址)联系起来的结点的整体。

  • 存储密度:数据本身所占存储量 / 整个结构所占存储量

三、单链表的插入删除

  • 单链表表示

    TYPE pointer = ↑ node ;

    ​ node = RECORD

    ​ data : datatype ;

    ​ next : pointer ;

    ​ END ;

  • 链表中插入数据元素

    具体框架:

    PROC LinkList ( VAR H:link ; a,b :datatype ) ;

    BEGIN NEW( s ) : S↑.data =b;

    CASE

    H = NIL : [ S↑.next nil ; H ← S] ;

    H↑.data = a : [ S↑.next H ; H ← S] ;

    ELSE [ P ← H ;

    WHILE ( P↑.data ≠ a ) and ( P↑.next ≠ nil ) DO

    [ SAVE ← P ; P ← P↑.next ] ;

    IF P↑.data = a THEN [ S↑.next ← P ; SAVE ↑ next ← S ]

    ​ ELSE [ P↑.next ← S ; S↑.next ← nil ]

    ]

    END CASE

    END ;


第四章 栈和线性表

一、队列、假溢出等

  • 栈:栈是一个下限为常数,上限可变化的向量(或者反之),也称为堆栈或堆阵;可变的一端为栈顶,不变化的一端为栈底。[后进先出]

  • 队列:队列是一个下限和上限只能增加而不能减少的向量(或者反之)。取出元素的一端称队首,加入元素的一端称队尾。[先进先出]

  • 线性表与栈异同:栈中的插入、删除操作只能在一端,不能在任意点;栈是受限的线性表。

  • 线性表与队列异同:队列的插入、删除操作只能在特定的位置;队列是受限的线性表。

  • 假溢出:当尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置。

三、循环队列的出入队

若空间编址范围 m…n

存储结构定义实际上就是一个一维数组:

VAR CQ: Array [m..n] OFdatatype;

​ front,rear: integer;

(1)入队过程:

PROC AddQ(CQ, x, front, rear)

​ {front, rear 分别为队列CQ的首尾指针,数据元素 x 入队}

BEGIN rear←rear+1;

​ IF rear=n+1 THEN rear←m;

​ IF rear=front THEN write(“queue full”)

​ ELSE CQ[rear]←x

END;

(2)出队过程:

PROC DelQ(CQ, x, front, rear)

​ {front, rear 分别为队列CQ的首尾指针,进行出队运算}

BEGIN

​ IF rear=front THEN write(“queue empty”)

​ ELSE 【 IF front=n THEN front←m

​ ELSE front←front+1;

​ x ←CQ[front] 】

END;


第五章 串

一、串及串的模式匹配

  • 串:一个由零个或多个字符组成的有穷序列称为串。

  • 匹配:设有两个串P和S:

    ​ P= 'p1p2p3…pm'

    ​ S= 's1s2s3… sn '

    ​ 其中0<m<n(通常m<<n),

    在S中找出一个与P相同的子串,即子串的定位。

    通常把S称为目标(或正文),把P称为模式,把从目标S中查找模式P的过程称为串的模式匹配。


第六章 数组和广义表

一、稀疏数组、广义表

  • 数组:
  1. 一维数组是个向量,它的每个元素是该结构中不可分割的最小单元;

  2. n维数组是个向量,它的每个元素是一个n-1维数组,且具有相同的下限和上限。

  • 稀疏数组:在一个数组中和某元素比较而言,不相同的元素很少时,称此数组为稀疏数组。

  • 稀疏矩阵:是稀疏数组的典例。

  • 广义表:广义表是零个或多个原子或子表所组成的有限序列,一般简称为表(或列表)。

二、稀疏矩阵的存储表达

  • 三元组:将矩阵的全部非零元素抽象为一个线性表,每个元素含行、列、值三个数据项。

    元素结构:行-列-数据

  • 十字链表:对于非零元素依据行、列特性,每一行和每一列建立一个循环链表。


第七章 树形结构

一、二叉树、遍历、线索树、霍夫曼树等

  • 树:树是具有以下性质的有限个结点组成的非空集合。
  1. 树中有且只有一个称为根的结点

  2. 除根结点以外,其余结点分成m(m>0)个不相关的集合T1,T2,…,Tm ,其中每个Ti都是树,而且都称为T的子树。

  • 二叉树:二叉树是满足以下性质的结点的有限集合。
  1. T是空集;

  2. 或者包含一个根结点,且其余结点分成两个不相交的集合,并分别被称为根结点的左子树和右子树。

  • 遍历:对于给定数据结构,系统的访问该结构中的每个结点,且每个结点仅被访问一次的操作过程称为遍历。

  • 二叉树的遍历规则:

  1. 层次策略(自上而下,从左到右)

  2. 深度策略(先中后/根 左右)

  • 线索:将二叉树的空指针利用起来,用于表示某线性关系下前趋或后继时,这种指针称为线索。

  • 线索化:给二叉树加线索的过程称为线索化。

  • 线索树:带线索的二叉树称为线索二叉树,简称为线索树。

  • 二叉排序树:二叉排序树或空二叉树,或者是满足以下要求的树、二叉树

  1. 若是它的左子树非空,则左子树上所有结点的值均小于根结点的值;

  2. 若是它的右子树非空,则右子树上所有结点的值均大于根结点的值;

  3. 左右子树也分别是二叉排序树;

  4. 没有键值相等的结点;

  • 霍夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

二、转换、遍历方法、加线索、霍夫曼树、二叉排序树

  • 树转二叉树:

    1. 加线 :兄弟结点间加虚线

    2. 抹线:只保留与长子的连线

    3. 调整:以根结点为轴心 (注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子)

  • 二叉树还原树:

    1. 加线:左孩子的右链加线

    2. 抹线:划掉与右孩子间的线

    3. 调整:层次调整

  • 森林转二叉树

    1. 树转换:将每棵树转为二叉树。

    2. 二叉树连接:保持第一颗二叉树不动,从第二棵二叉树开始,依次把后一颗二叉树的根结点作为前一颗二叉树的根结点的右孩子,用线连接起来。

  • 二叉树还原森林

    1. 抹线:从根节点开始,若右孩子存在,则把与右孩子结点的连线删除。再查看分离后的二叉树,若其根节点的右孩子存在,则连线删除… 直到所有这些根节点与右孩子的连线都删除为止。

    2. 还原:将每棵分离后的二叉树转换为树。

  • 二叉树的前中后三种遍历方法

  • 给二叉树加线索

  • 霍夫曼树及霍夫曼编码的构造

  • 二叉排序树的构造

三、二叉树遍历方法的应用

  1. 交换二叉树的左右子树

    PROC exchange ( VAR T :Birary Tree)

    BEGIN

    IF T ≠ nil THEN [ swap (T.lson , T.rson);

    ​ Call exchange ( T.lson )

    ​ Call exchange ( T.rson) ]

  2. 求二叉树的高度

    1. 采用一般过程进行设计

      PROC high ( VAR T:Binary Tree ; h: integer):

      BEGIN

      IF T = nil THEN h ← 0

      ELSE [ call high ( T.lson,nil ) ;

      ​ call high ( T.rson,nil ) ;

      ​ h ← H.max (h1, h2 ) ]

      END ;

    2. 采用函数过程进行设计(最恰当)

      FUNC high ( VAR T: Binary Tree )

      BEGIN

      IF T = nil THEN high ← 0

      ​ ELSE high ← H.max (high(T.lson) , high(T.rson) )

      END

    3. 统计二叉树的叶子结点个数

      1. 采用一般过程设计

        PROC leave (VAR T :Binary Tree); L:integer)

        BEGIN

        IF T = nil THEN L ← 0;

        ​ ELSE (IF T.lson)=nil AND T.rson= nil THEN ;

        ​ ELSE [ Call leave (T.lson,l1)

        ​ Call leave (T.ron,l2)

        ​ L ← L1 + L2 ;]


第八章 图结构

一、拓扑排序、关键路径、最小生成树

  • 图:由n(n≥1)个结点V1,V2,…,Vn 构成的数据称为图。

  • 图的遍历:给出图G和其中的任意一个顶点V0,从V0出发系统的访问G中所有的顶点,且每个顶点仅被访问一次,这一过程称为图的遍历。

  • 图的遍历方法:

    • 深度优先搜索(DFS,depth-first search)

      搜索中,结点扩展的次序向某一个分支纵深推进,到底后再回溯。

    • 广度优先搜索(BFS,breadth-first search)

      搜索中,对所在层次的所有结点逐个依次进行扩展后,再推进到下一个层次进行扩展。

  • 拓扑排序:

    对于有向图G=(V,E),V中的顶点的线性序列(vi1, vi2, … , vin),称作一个拓扑序列,若此结点序列满足如下条件:在G中从顶点u到顶点v有一条路径,则在序列中u必在v之前。

    寻找拓扑序列的有效手段,就是进行拓扑排序。

  • AOV网:若有向图G中,顶点表示活动或任务,有向边表示活动或任务之间的优先关系,则此有向图称为顶点表示活动的网络。(AOV-网,Activity On Vertex Network)

  • AOE网:若在带权有向图中顶点表示事件,有向边表示活动,权表示活动持续的时间,则此有向图称为边表示活动的网络(AOE-网, Activity On Edge Network).

  • 关键路径:任务计划作业图上的需要时间最长的路径(可有多条)。它决定完成总任务的时间。

  • 最小生成树:可系统访问所有顶点,图的所有顶点,再加上遍历过程中经历的边所构成的子图实际上是一棵树,我们称做生成树。边的权值之和最小的生成树称为最小生成树。

二、图的存储、构造最小生成树

  • 图的存储

    1. 邻接矩阵:表示顶点之间邻接关系的矩阵

    2. 邻接表:对图的每个顶点建立一个链表

  • 构造最小生成树

    1. Prim算法:每一步中都找出一个最小权的边

    2. Kruskal算法:按照权值递增的顺序逐个考虑E中的每条边


第九章 排序

一、分类、稳定性、堆

  • 排序:设含有n个记录的集合为R={r1,r2,…,rn},其对应的关键字集合为K={k1,k2,…,kn},给定关系a,按照关系a针对关键字集合K对R进行运算,使得R有如下序列: (ra1, ra2 ,…, ran),我们将这个操作过程称为排序。

    排序(又称分类)通常可以理解为:根据与项目中所包含的关键字或信息项的有关规则,对信息项目加以排列整理的动作过程。

  • 排序的稳定性:在排序关系下,假设排序前ri在rj之前,排序之后领先关系不变,则称此排序过程和排序方法是稳定的,否则是不稳定的。

  • 排序的分类:依据排序过程中数据所处位置,将排序分为内排序、外排序两大类。

  • 堆:设L是长度为n的表,当1≤i≤ 【n/2】(向下取整) 时,其数据元素满足:

    L(i)≤L(2i) 且 L(i)≤L(2i+1), 则称L是一个堆。

    其中:将 L(1)称为堆顶

    ​ L(n)称为堆底

二、对一趟的掌握、堆的构造

  • 对“一趟”的掌握

    1. 直接插入

      将要排序的源文件F=R1,R2,…,Rn,视为两部分:

      ​ F1=R1; F2= R2,…,Rn

      对F1和F2重复如下工作:

      ①从F2中取出一个记录Ri,并将Ri从F2中删除;

      ②将Ri插入到F1并使F1线性有序。

    2. 快速排序

      (以下比较指关键的比较,关键字指排序关键字)

      ​ 在待排序的n个记录中任取一个记录r(例如就取第1个),作为轴心元素;

      ​ 以r为标准将所有记录分为两组;

      ​ 第1组中各记录的关键字都小于r的关键字;

      ​ 第2组中各记录的关键字都大于r的关键字;

      ​ 并把r排在这两组中间(最终位置),这一过程称为一趟快排。

      ​ 然后对这两组分别重复上述方法,直到所有记录都排在应有位置上。

    3. 二路归并

      ​ 如果文件中有n个记录,可将文件看成n个有序的子文件,这样就出现文件“部分有序”的状态;因而可以使用合并排序。

      ​ 不过合并n个有序段,其操作较为复杂;

      ​ 通常可以先将每两个子文件进行合并,得到n/2个部分有序的较大子文件,每个子文件含有两个记录;

      ​ 再将这些子文件合并,如此反复,直到最后合并成一个文件时,排序就完成了;

    4. 基数排序

      把每个关键字看成d元组:

      ​ Ki=(k1i ,k2i , … , kdi)

      ​ 其中: C0≤kji≤Cr-1 (1≤i≤n, 1≤j≤d)

      ​ 排序时先按kdi的值从小到大将记录分配到r个盒子中去,然后依次收集这些记录;

      ​ 再按kid-1的值从小到大将记录分配到r个盒子,如此反复,直到对k1i的分配和收集后就得到完全有序的文件。

      ​ 其中r称为基数, 执行基数排序时, 为了实现分配和收集,需设立r个队列。

  • 堆的构造:插入建堆、删除建堆。

三、二分插入排序

也称折半插入排序。与直接插入排序的区别:在插入第i个时搜索采用二分策略。

仅对比较次数有改善,移动次数无影响。算法过程如下:

PROC DichSort(VARR:ARRAY[1..n] OF datatype);

BEGIN

​ FOR i←2 TO n DO

​ 【x←R[i]; l←1; h←i-1;

​ while l≤h DO

​ 【 m←(l+h) DIV 2;

​ IF x.key<R[m].key THEN h←m-1

​ ELSE l←m+1 】 ;

​ FOR j←i-1 DOWNTO l DO R[j+1]←R[j] ;

​ R[l]←x】

END;


第十章 数据检索

一、AVL树、散列表等

  • 检索:在给定数据结构中查找满足某种条件的数据元素(或结点,记录)的过程。

  • 检索的分类:

    1. 性质(关键字、属性)

    2. 数据组织(线性、树形、散列)

  • 平均检索长度:检索过程中对关键字(或属性)要执行的平均运算次数,即平均检索长度(ASL, Average Search Length)。

  • AVL树:

    ①一棵空二叉树是AVL-树;

    ②若T是一棵非空二叉树, 其任何结点的左、右子树的高度相差不超过1,则T是AVL-树。

  • 散列表:散列表既是一种存储方法, 也是一种常见的检索方法。

    散列法的基本思想:将关键字看成一个变量,通过一定的函数关系,将函数值解释为存储地址,将结点存入这样计算得到的地址单元中,检索的过程是存储过程的逆过程。

    把用散列法组织存储的线性表称为散列表(hash table)。

  • 碰撞:依据散列函数H计算出地址,若发现此地址已经被别的结点占用,即有两个或多个不同的关键字映射到了同一个地址空间的现象。

  • 同义词:产生碰撞的两个或多个关键字称为同义词。

  • 堆积:把两个同义词子表结合在一起的现象称为“堆积现象”或“群集现象”。

二、AVL树的构造

​ 选择离插入(或删除)结点最近的不平衡结点(其平衡因子为±2)开始调整。

LL型:

RR型:

LR型:

RL型:

三、二分检索

二分检索的基本作法:

​ 先取表的中间位置的记录关键字值与所给关键字值进行比较,如果给定值比该记录的关键字值大,则给定值必在表的后半部分;

​ 在这后半部分中再取中间位置的记录进行比较,又可舍去这部分中的一半;

​ 依次重复,直到找到或查完全表而查不到为止。

算法过程:

PROC dichotomize_search(VAR R:ARRAY[1..max] OF datatype;

​ n:integer;k:Ktype);

BEGIN low←1; high←n;

​ WHILE low≤high DO

​ 【 middle←(low+high) DIV 2;

​ CASE

​ k<R[middle].key : high←middle-1;

​ k=R[middle].key : 【write('success' , middle);exit; 】;

​ k>R[middle].key : low←middle+1;

​ ENDCASE】 ;

​ write('unsuccess')

END;


第十二章 文件

一、组织分类、静动态索引、外排序等

  • 文件:文件,为了进行存取控制、检索和修改而组织在一起的数据记录的集合。

  • 逻辑组织分类:

    1. 字符流文件:有序的字符流序列,文件基本单位为字节或字。

    2. 记录文件:数据记录的集合,文件的基本单位为记录(定长或变长记录)。

  • 物理组织分类:

    1. 顺序文件:按照数据到达的时间先后次序进行组织的文件。

    2. 散列文件:按照散列方式组织的文件。

    3. 索引文件:组织数据时需要带一个索引表。按该结构组织的文件。

  • 静态索引结构:静态索引结构是指索引结构在文件创建,初始装入记录时生成,一旦生成就固定下来,在系统运行(例如插入/删除)过程中索引结构并不发生变化,只有当文件重组时才允许改变索引结构。

  • 动态索引结构:动态索引结构是指文件创建,初始装入记录时所生成的索引结构,在系统运行(例如插入/删除)过程中索引结构本身也能够发生改变。

  • B- 树

    作用:由于对B树的查找、插入、删除均始终能够保持B树的动态平衡,

    本质:一种平衡的多分树。

    B+树是B-树的变形,可以在叶结点存储关键字信息。

  • ISAM文件的本质:静态索引文件

  • VSAM文件的本质:动态索引文件

  • 外排序的基本方法:合并排序(生成初始顺串、合并初始顺串)

PDF版下载点此

©RoseauHan @2018 - Jan

本文首发地址 http://roseauhan.com/post/ea399710.html

相关文章

网友评论

      本文标题:Data Structure Summary

      本文链接:https://www.haomeiwen.com/subject/oseixftx.html