数据结构
文章平均质量分 80
Benson_CSU
熟悉Java平台开发,对Spring生态系统、MyBatis、Activiti等框架有所涉猎。喜好研究各种新兴技术。
熟悉Android开发
展开
-
数据结构——线性表
线性表数据类型的概念 我曾经问过我的一些非计算机专业朋友对“数据类型”这个概念怎么理解,他们的回答基本上都是说数据类型应该就是指数据的一种类型划分吧,就像把人分成白种人、黑种人和黄种人,或者把动物分成什么种属之类的。 确实是这样,数据类型就是对数据的一种类型标注,比如最基本的一些数据类型,int型表示32位2进制的整数类型,double表示双精度浮点类型、char原创 2018-01-31 22:16:21 · 177 阅读 · 0 评论 -
数据结构——拓扑排序
拓扑排序 在有向图中,有一种特殊的图,叫作有向无环图,也就是从图中的任意一个节点出发,都不可能回到出发点。有向无环图这种模型也有一定的适用场景,比如说在工程领域,可以把工程的每个小过程建模成图中的节点,由于工程进行时是有方向的,因此要用有向图,工程的进行不能有死循环,否则工程可能会陷入这个死循环中永远也完不成。判断一个工程是否完成可以通过判断工程的如有向图是否是有向无环图来判断,如原创 2018-02-03 01:38:41 · 728 阅读 · 0 评论 -
数据结构——关键路径
关键路径 在拓扑排序一文中讲到了有向无环图,这种有向图可用于对项目工程进度的研究领域,也叫"顶点表示活动图"(Activity On Vertex,AOV图),图中的每个节点都表示工程中的一个子过程,也就是一个活动。而在真正对工程进行研究时,通常一个活动是需要一定耗费的,因此用节点来表示工程中的事件,用边来表示活动更方便。在软件工程中,这些节点表示的事件可以是项目启动、需要分析开始原创 2018-02-03 12:40:21 · 1165 阅读 · 0 评论 -
数据结构——单源最短路径Dijkstra算法
单源最短路径Dijkstra算法 在现实世界中,经常有从一个城市到另一个城市选择最短路径的场景,这种场景也可以是网络数据传输过程中从一个网络节点到另一个网络节点进行路由。可以把这种场景建模成一个有向网,而耗费就是边上的权值,那么这类场景的问题就是在网中一点到另一点的最短路径问题了。 如果已经知道从节点s到节点e的最短路径是(vs,...,vk,ve)那么vs到vk的原创 2018-02-03 14:29:57 · 708 阅读 · 0 评论 -
数据结构——最短路径Floyd算法
最短路径Floyd算法 上一篇博客讲到了Dijkstra算法的原理和用C++的代码实现。Dijkstra算法可以解决任意点到其他点的最短路径问题。在Dijkstra算法中,最后一个循环是个双层循环,在最坏情况下,每个节点都可以指向其他所有节点,那么Dijkstra算法的时间复杂度就是O(n^2)了。如果想让图中每个点到其他所有点的最短路径,就需要把Dijkstra算法执行n次,那么原创 2018-02-03 15:31:03 · 595 阅读 · 0 评论 -
数据结构——二叉排序树
二叉排序树 排序是将一个无序的序列整理成有序的一个过程。这个整理的过程可以使用一些特殊的数据结构来提高效率,比如说二叉排序树。 二叉排序树是一种二叉树,又叫二叉查找树。一棵二叉排序树要么是一棵空树,否则如果根节点有左子树,那么左子树的所有节点的值小于根节点的值,如果右子树不能空,那么右子树上所有节点的值要大于根节点的值。 为什么二叉排序树又叫二叉查找原创 2018-02-03 18:34:09 · 934 阅读 · 0 评论 -
数据结构——平衡二叉树
二叉平衡树 上一篇博客写到了二叉排序树,二叉排序树在最好的情况下,其时间复杂度为O(logn),而在最坏的情况下,二叉排序树变成一个线性表,查找也就变成了顺序查找,时间复杂度为O(n),所以二叉排序树的查找效率取决于树的形状,而树的形状又取决于构造树节点的元素序列,如果这个序列是完全有序的,那边构造出来的二叉排序树就是一个线性表了。如果能把二叉排序树整理得深度尽量小,那么查找的原创 2018-02-03 22:55:30 · 557 阅读 · 0 评论 -
数据结构——哈希
哈希 像C++和Java这种高级语言,都提供了哈希(Hash)的集合库。Hash也是一种数据结构,这种数据结构的特点就是可以储存键值对,每个键都对应着一个值,可以通过键在Hash表中快速查找到这个键所对应的值。Hash表会预先申请一块比较大的内存,当向Hash表中添加键值对时,就直接存入在已经申请的内存中。通常,Hash需要一个Hash函数来确定这个值应该存放在哪里,因为在Hash表原创 2018-02-03 23:27:07 · 419 阅读 · 0 评论 -
数据结构——2-3树
2-3树2-3树的概念 前面讲到了二叉搜索树(BST)和二叉平衡树(AVL),二叉搜索树在最好的情况下搜索的时间复杂度为O(logn),但如果插入节点时,插入元素序列本身就是有序的,那么BST树就退化成一个线性表了,搜索的时间复杂度为O(n)。之所以会变成O(n),是因为树的高度变大了,BST的比较次数最大是等于树的高度的。因此,如果想要减少比较次数,就需要降低树的高度。在插入原创 2018-02-04 14:35:40 · 8298 阅读 · 2 评论 -
数据结构——红黑树
红黑树为什么要红黑树 红黑也是一种二叉平衡树,但红黑树不要求全局平衡,只需要局部平衡,这样的好处是在插入和删除这种改变树形态的操作时效率更高。普通的二叉平衡树要求全局平衡,为之付出的代价会非常大。但红黑树只要求局部平衡,需要查找的性能不是最优的,但也是比较优的,而且平衡的代价也比较小,红黑树对修改的查找效率进行了平衡取舍。2-3树由于有两种节点类型,并且4节点的分裂比较复杂,因此原创 2018-02-04 15:22:12 · 232 阅读 · 0 评论 -
数据结构——最小生成树Kruskal算法
最小生成树Kruskal算法 上一篇博客讲了最小生成树的Prim算法。而另一种常见的最小生成树算法就是克鲁斯卡尔算法。 Kruskal算法跟Prim算法的思路不一样,Prim算法还是一种树由根到叶子节点的生成方法,也就是生成树慢慢长大,每次都往生成树中添加新的节点,最后让生成树中包含图中的所有节点。而Kruskal算法则是初始时把所有的节点都当成一棵树,通过树的合并原创 2018-02-03 00:01:25 · 847 阅读 · 0 评论 -
数据结构——最小生成树Prim算法
最小生成树Prim算法 在保证图连通的情况下,去掉边数最多所得到的树叫做最小生成树。也就是说一个图,去掉一些边后,图仍是连接的,而这时图剩下的边数最少就是最小生成树,这时候图一定是树状结构的。可以用反证法:如果不是树状的,也就是说还有闭环,那么一定可以再去掉一些边使图中的所有闭环被破坏,最终图一定就是树状结构了,但如果已经成为了树状结构,再去掉一条边,那么一定会有至少一个节点不能原创 2018-02-02 22:31:28 · 864 阅读 · 0 评论 -
数据结构——栈与队列
栈与队列栈是种非常重要的数据结构,因为其特殊的数据储存结构,在计算机编程中有非常广泛的应用。比如说一些基于堆栈的编程语言,程序的运行就是基于栈式结构的,比如说Java程序,当一个方法调用另一个方法时,就会把当前方法的输入、输出类型和一些变量存入栈帧中,然后调用另一个方法,这个方法就成为另一个栈帧,压在调用方法栈帧上方,当被调用方法返回时,就把这个方法的栈帧Pop出来,调用方法回到调原创 2018-02-01 11:38:21 · 251 阅读 · 0 评论 -
数据结构——循环队列
循环队列 基于链式储存结构的队列优点和链式线性表一样,不需要依靠多次移动数组元素来保持数据结构的稳定性,但是缺点也很明显,就是每添加一个元素就需要申请一次内存。而基于顺序储存结构的队列可以预先申请一块内存,每添加一个元素时只需要把节点放在数组的末尾就可以了,但取队首元素时就比较复杂了,需要把从第二个元素开始,都向前移动一位。 循环队列可以在保证少移到数组元素的同时原创 2018-02-01 13:33:10 · 710 阅读 · 0 评论 -
数据结构——二叉树
二叉树线性表、栈和队列都是一种线性的数据结构,数据元素在组织结构上呈现线性排列,从二维视角来看,一个元素向前最多只会有一个元素,向后只最多只会有一个元素。但数据的结构可能更复杂,比如说数据排列可以呈现一种分支的情况,一个元素向某个方向可能有多个分支,这里就需要其他数据结构来描述。树是一种能够一对多的数据结构,可以描述一个节点和多个节点之间的关系。数据结构中的树是一棵倒着的树,树根在原创 2018-02-01 16:28:18 · 305 阅读 · 0 评论 -
数据结构——由前序和中序遍历构造二叉树
由前序和中序遍历构造二叉树 二叉树的前序遍历是先访问二叉树的根节点,再访问左子树节点,最后访问右子树,而中序遍历则是先访问左子树,再访问根节点,最后访问右子树。根据这种访问过程的特性可以发现,先序遍历结果的第一个元素肯定就是树的根节点,根据这种元素可以把中序遍历结果分成两部分,左部分就是二叉树的左子树,右部分就是二叉树的右子树。再根据先序遍历和中序遍历的特性,先序遍历结果的第原创 2018-02-01 18:48:39 · 960 阅读 · 0 评论 -
数据结构——线索二叉树
线索二叉树 线索二叉树的概念 一棵二叉树,最下面一层全是叶子节点,这些叶子节点的左右孩子指针全为NULL,其实是浪费了这些内存。详细计算一下,节点二数为n的二叉树有n+1个空指针。这是怎么算来的呢?其实有个非常简单的算法:有n个节点的二叉树很明显有2n个指针,而这n个节点除了主根节点,其他节点都有一条连线指向这个节点的父节点,反过来来看,这个连线就是父节点指向这个节点的指针,因原创 2018-02-01 21:00:24 · 702 阅读 · 0 评论 -
数据结构——哈夫曼编码
哈夫曼编码 在计算机世界中,任何事物都是二进制的,比如说数字、字符、颜色、声音等等,都是以二进制的形式存的,而在物理设备中用磁极或者电极来表示0或1,并通过电流的形式来传输,传输的过程中有数-模和模-数的转换。由于只有0和1两种数字,因而不同的数据就会用0和1不同的编排来表示,这种编排就叫作编码。编码是计算机中一个非常重要的概念,如果没有编码,就不会有计算机,因为只能处理0和1对于原创 2018-02-02 00:29:10 · 8833 阅读 · 0 评论 -
数据结构——图的储存结构(邻接矩阵)
图的储存结构 线性表是一对一关系,树是一对多关系,而现实生活中还存在一些多对多关系。比如交通网络,多个交通枢纽之间的连线可能错综复杂,一个交通枢纽会连接其他多个交通枢纽,而这个交通枢纽也会被其他多个交通枢纽连接,形成一个网络结构。这种网络结构就像地图上的交通路线一样,所以在数据结构中用图来描述这种多对多的关系。树是一种特化的图,就是图中每个节点都只被一个其他节点连接,而自己这个节点原创 2018-02-02 14:43:43 · 860 阅读 · 0 评论 -
数据结构——图的储存结构(邻接表)
图的储存结构(邻接表) 图用邻接矩阵储存时,是用的一个二维数组,操作这个图的时候就相当于操作这个二维数组。但一但使用数组时就有一个很明显的缺点,那就是动态扩容性,基于邻接矩阵的图不能添加节点,只能添加边。如果图是一个节点非常多的稀疏图,比如说这个n为一亿,那么所需要的内存就是100000000 * 100000000 = 10000000000000000个单位,而其中非常多的内存原创 2018-02-02 16:05:01 · 822 阅读 · 0 评论 -
数据结构——图的遍历
图的遍历 树常见的遍历方式有先序、中序、后序以及层次遍历,同样,图也有常见的两种遍历方式,分别是深度优先搜索(DFS)和广度优先搜索(BFS)。见名知意,深搜的策略就是从一个节点开始,访问到一个节点就标记一下,向第一个邻接节点方向搜,如果第一个邻接节点已经被标记访问过了,就向每二个邻接节点方向搜等等,再后再向第一个邻接节点的第一个邻接节点搜,这样递归搜索,直到当前访问的节点的所有邻接节原创 2018-02-02 17:08:37 · 647 阅读 · 0 评论 -
数据结构——2-3-4树与红黑树
2-3-4树与红黑树2-3-4树 前面讲到了2-3树,2-3树是允许节点最多有三个子节点的树,2-3树中有2节点和3节点,2节点跟普通的二叉树节点一样,3节点AB就是的左子树上的所有节点的值小于A,中子树上所有节点的值大于A而小于B,右子树上节点的值大于B。2-3树是一种平衡树。 2-3-4树跟2-3树差不多,只不过是把节点的最大子节点个数扩充到了4个,所以2-原创 2018-02-04 19:08:44 · 446 阅读 · 0 评论