本文十分零散,目的仅做自己整理使用,暂不对读者负责,阅读需谨慎。学习数据结构的材料是《大话数据结构》。
概览
数据结构包含线性结构、树形结构、图结构,重要的操作包括查找与排序(还有其他的各种操作)。线性结构中有线性顺序表、链表、静态链表,链表中有单链表、双向链表、循环链表,线性结构的典型应用有栈、队列与串(后面还没有写栈和队列,串),树形结构中有双亲表示法、孩子表示法、孩子兄弟表示法、二叉链表、霍夫曼树,图形结构中有邻接矩阵法、邻接表法、边集数组法,查找算法包括线性查找、折半查找、插值查找、斐波那契查找、二叉排序树查找、散列查找,排序算法包括交换类、选择类、插入类、归并类。
线性结构
线性结构是最简单的结构,每一个数据元素只有一个前驱和一个后驱。
实现线性结构可以采用顺序存储结构和链式存储结构。
静态链表:如果一种语言中既没有指针也没有对象引用机制,为了实现链表这种数据结构,可以基于数组建立静态链表。静态链表中的数组的每个元素中除了数据本身的数据项,还保存了一个后驱元素的数组下标,称为游标。这有点类似于树形结构当中的双亲表示法,区别在于双亲表示法当中可以有多个结点中存储同一个结点的下标,而静态链表当中每个元素的下标只能保存在一个元素的游标里。静态链表的数组中未被使用的元素组成了一个备用链表。删除结点时,该结点所在的数组元素会进入成为备用链表的第一个结点;增加结点时,会取用备用链表的第一个结点所在的数据元素。这样一来,在静态链表中插入结点或删除结点时,只需要修改结点中的游标,不需要像顺序线性表那样把后面的元素都移位了。
单链表还可以改进为循环链表或双向链表。循环链表:把单链表最后一个结点的空指针指向单链表的头指针,就形成了循环链表。这样从任何一个链表开始都可以对整个链表进行遍历,典型的应用例子为约瑟夫问题。双向链表:在单链表的结点中再多加入一个指针指向结点的前驱,就得到了双向链表,虽然比单链表更耗费空间,双向链表使用起来更加灵活。
线性表有两个非常重要的应用,分别是栈和队列。“两栈共享空间”是对顺序栈的优化,可以最大限度利用开辟的空间。“循环队列”是对顺序队列的优化。在可控元素数量时,最好用顺序栈和顺序队列,否则用链栈和链队列。
串(线性存储结构、链式存储结构。模式匹配算法:朴素模式匹配算法是真实诚、真是慢啊,KMP模式匹配算法避免了i值不必要的回溯,KMP模式匹配算法改进避免了j值不必要的回溯)
树
线性表中每个数据元素只有一个前驱和一个后驱,而树形结构中每一个数据元素有一个前驱和多个后驱。数据结构要能保存数据本身以及数据相互之间的关系,表示该关系的载体就