基础数据结构与算法
文章平均质量分 79
本栏讲述的是笔者数据结构与算法的学习之路。
全文算法和数据结构大多出自《算法4》(谢路云译)和《数据结构》(严蔚敏)
叙狼烟
十年苦饮深井冰,一腔热血沸欲倾。
展开
-
图(4)——最短路径
最短路径找到从一个顶点到另一个顶点的成本最小的路径。原创 2017-05-24 21:48:38 · 334 阅读 · 0 评论 -
图(3)——最小生成树
最小生成树最小生成树:一幅加权图的最小生成树是他的一棵权值(树种所有边的权值之和)最小的生成树。关于最小生成树的一些约定:1)只考虑连通图2)边的权重不一定表示距离3)边的权重可能是0或负数4)所有边的权重都各不相同原创 2017-05-22 20:21:49 · 510 阅读 · 0 评论 -
图(1)——无向图
无向图术语表图:由一组顶点个一组能够将两个顶点相连的边组成。自环:一条连接一个顶点和其自身的边。平行边:连接同一对顶点的两条边称为平行边。多重图:含有平行边。简单图:没有平行边和自环。相邻:两个顶点通过一条边相连,并称这条边依附这两个顶点。顶点的度数:依附于他的边的数量。子图:一幅图的所有边的一个子集(以及所依附的所有顶点)组成的图。路径:由边顺序连接的一系原创 2017-05-17 21:16:07 · 942 阅读 · 0 评论 -
图(2)——有向图
有向图原创 2017-05-20 22:13:29 · 1175 阅读 · 0 评论 -
基础数据结构与算法--序
一、序幕近日欲重学数据结构和算法,便开本篇博客做为记录整理。本篇博客所以代码都是以《数据结构(C语言版)》(严蔚敏,吴伟民著)《算法(第4版)》([美]Robert Sedgewick Kevin Wayne著)为基础编写。但因本人欲以c++为主要编程语言,所以代码都是以c++为主。本篇代码和见解都仅代表个人意见,由于本人资历尚浅,所作有所不足之处,还望各位看官担待。二、类容介绍原创 2017-04-24 12:50:57 · 428 阅读 · 0 评论 -
线性表
一、基本概念:1.线性表:是N个数据元素的有限序列。2.特点:1)存在唯一一个被称为“第一个”的元素;2)存在唯一一个被称为“最后一个”的元素;3)除第一个元素外,每个元素都有唯一的前驱;4)除最后一个元素外,每个元素都有唯一的后继。3.分类:1)顺序存储的线性表:物理地址的连续存储;2)链式存储的线性表:逻辑地址的连续存储。比较:原创 2017-04-24 17:58:53 · 404 阅读 · 0 评论 -
线性表续——双向、循环链表
循环链表:首尾相连的链表,即last的后继为first。循环链表API:templateclass xlist xlist()创建一个空链表bool Empty()链表是否为空int size()链表长度void push(Item item)链表尾添加元素Item pop()链表头原创 2017-04-25 20:35:36 · 324 阅读 · 0 评论 -
栈、队列与背包
栈和队列栈:一种基于后进先出策略的集合类型;在链表的表示方法下,栈在同一端进出元素,所以只需要一个指针域即可。栈API:class stack{stack()创建一个空栈void Empty()判断栈是否为空void size()栈长void push(string item)进栈原创 2017-04-29 19:46:51 · 359 阅读 · 0 评论 -
排序(1)---基础排序
基础排序在排序算法中,我们需要计算比较和交换的数量。对于不交换元素的算法,我们会计算访问数组的次数。在排序算法中额外的内存开销和运行时间是同等重要的。排序算法分为两类:一、除了函数调用所需要的栈和固定数目的实例变量之外无需额外内存的原地排序算法。二、需要额外内存空间来存储另一份数组副本的其他排序算法。一、选择排序过程:找到数组中最小的数,和首位元素交换(如果首元原创 2017-04-30 19:10:46 · 263 阅读 · 0 评论 -
排序(2)---希尔排序
希尔排序希尔排序是一种基于插入排序的快速的排序算法。原创 2017-05-02 21:50:50 · 259 阅读 · 0 评论 -
排序(3)---归并排序
归并排序归并:将两个有序数组归并成为一个更大的有序数组。原创 2017-05-03 21:55:49 · 183 阅读 · 0 评论 -
排序(4) ---快速排序
快速排序原创 2017-05-05 09:52:05 · 241 阅读 · 0 评论 -
排序(5)---堆排序
堆排序堆有序:二叉树的每个结点都大于等于他的两个子结点,被称为堆有序。二叉堆:是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级储存。原创 2017-05-05 20:14:00 · 357 阅读 · 0 评论 -
排序(6)---总结
出处:todayx,排序总结1. 快速排序介绍:快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真转载 2017-05-05 22:24:25 · 183 阅读 · 0 评论 -
优先队列
优先队列优先队列是对前面两章的补充。一种支持:删除最大元素和插入元素的数据结构被叫做优先队列。他与队列和栈相类似,不同点在于,他的运作方式与前面所提到的二叉堆相同,或者说堆排序就是借助了优先队列的思想。核心点为:将数组排为有序堆,这样便能完成删除最大元素的步骤。优先队列API:class MaxPQ{MaxPQ{构建一个空优先队列原创 2017-05-06 21:09:19 · 403 阅读 · 0 评论 -
树(1)---序论
树的基本概念树的定义:树是N(N>=0)个结点的有限集合,N=0时,称为空树。非空树应满足:1)有且仅有一个特定的称为根的结点。2)当N>1时,其余结点可分为m(m>0)个互不相交的有限集合,每一个集合又被称为子树。显然树的定义是递归的,是一种递归的数据结构。树做为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:1)树的根结点没有前驱结点,除根外有且只有一个前驱原创 2017-05-07 16:12:32 · 232 阅读 · 0 评论 -
树(2)---二叉树
二叉树二叉树的定义二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树,(即二叉树中不存在度大于2的结点。且,二叉树左右有序,不能颠倒。二叉树也是递归的形式定义:1)为空二叉树,n=0;2)由一个根结点和两个不相交的左子树和右子树组成。左右子树分别又是两棵二叉树。特殊的二叉树:1)满二叉树:一棵高度为h,并且含有2^h-1个结点的二叉树称为满二叉树,即树中的每一层都原创 2017-05-07 16:25:44 · 374 阅读 · 0 评论 -
树(3)---树与森林
树的存储结构孩子兄弟法:原创 2017-05-09 20:52:02 · 335 阅读 · 0 评论 -
查找(1)---顺序查找
符号表在了解查找之前,首先我们要知道符号表,符号表有时被称为字典,也就是类似于单词的参考书。有时也被称为索引,即书本最后将术语按字母顺序列出以方便查找的那部分。符号表主要分为键和值,键就是查找目录中的关键字,而值目录所指向的信息。定义:符号表是一种存储键值对的数据结构。支持两种操作:插入(put),即将一组新的键值对存入表中;查找(get),即根据给定的键得到相应的值。原创 2017-05-11 19:21:36 · 411 阅读 · 0 评论 -
查找(2)---二分查找
二分查找(基于有序数组)二分查找的具体步骤:1.求取数组长中间数;2.比较查找键(key)和中间键(mid->key),1)如果key大,则选择数组后半部分,2)如果key小,则选择数组前半部分,3)相等,则输出值,结束查找;3.返回选择的数组继续前两步。很明显可以看出二分查找需要数组有序做为前提,所以在符号表中必然会有排序函数。同时我们使用数组的原因是原创 2017-05-11 21:13:15 · 228 阅读 · 0 评论 -
查找(3)---二叉查找树
二叉查找树原创 2017-05-12 20:01:27 · 355 阅读 · 0 评论 -
查找(4)---红黑二叉查找树
平衡查找树理想情况下我们希望能够保持二叉查找树的平衡性,在一棵含有N个结点的树中,我们希望树高保持在~lgN,这样我们就能保证所有的查找都能在~lgN次比较中结束,但是动态插入保证完美平衡的代价太高了。所以我们引入了一种新的方法,保证树的平衡性。2-3查找树定义:一棵2-3查找树,可能由以下结点组成:1)2-结点,含有一个键和两条链接,即二叉查找树中的结点;2)3-结点原创 2017-05-13 22:38:45 · 363 阅读 · 0 评论 -
查找(5)---散列表
散列表方法:用算术操作将键转换为索引来访问数组中的键值对。第一步是用散列函数将被查找的键转换为数组的一个索引。理想情况下每一个键都会有一个索引。当然这是理想情况,所以会有第二步,处理碰撞冲突的过程。两种解决碰撞的方法:拉链法和线性探测法。散列法是算法在时间和空间上做出权衡的经典例子。在一般情况下,散列法都能达到常数级别的插入和查找操作,这也使得他在很多情况下成为实现符号表的最佳原创 2017-05-15 19:35:25 · 377 阅读 · 0 评论 -
查找(6)---总结
几种查找方式的对比:符号表渐进性能的总结:算法最坏查找时间最坏插入时间平均查找时间平均插入时间内存使用顺序查找NNN/2N48N二分查找lgNNlgNN/216N二叉树查找NN1.39lgN1.39lgN64N红黑树2lgN2lgN1.原创 2017-05-16 09:49:32 · 433 阅读 · 0 评论 -
数据结构迭代器的构造
数据结构迭代器的构造一般情况下链表的遍历是通过指针的移动来寻找下一个结点,并输出数据的。但是在数据结构的设定中,结点都是被设为private的,也就是说我们无法在链表以外对链表元素进行逐个处理的,也就是说在对图中链表元素进行分类处理是很不方便的,所以为了比面这种情况,我们将为链表构造迭代器,用来处理链表元素。实现:链表迭代器的实现,便是用指针模拟正常的循环,所以我们需要:1.构原创 2017-05-19 16:04:57 · 1240 阅读 · 0 评论