数据结构与算法
文章平均质量分 94
数据结构与算法
zthgreat
这个人很懒,什么都没有留下
展开
-
图解B树的前世今生
背景注:本文假设读者有搜索树(排序树)的基础知识。我们知道计算的存储系统是一个分级结构(一般来讲,存储器速度越快,价格也越高,因而也越难满足大容量的要求)首先容量和类型不同的存储器在访问速度上的差异是极其悬殊的,就以我们最常见的磁盘以及内存这两级存储为例:就传统的旋转式磁盘而言 它的访问速度大致是毫秒量级,而典型的内存呢 大致是在纳秒量级,如果 以一秒为基准,前者是10的-3次方 而后者...原创 2018-12-07 20:06:12 · 1808 阅读 · 0 评论 -
亲自动手画红黑树
在前面我们学习了平衡二叉树,伸展树,今天我们来看看另外一种平衡二叉树—红黑树,本来这篇博客早在一年前就该写的,后来发生了太多故事,博客停止了更新了一年,如今又有了最初的斗志,决定好好把博客写下去,对知识的梳理的同时,也不断巩固。 对于各种平衡树,我只能进行简单的理解和实现,无法涉及太多的应用,主要的还是本身自己知识广度和深度有限,不过我相信:不积跬步,无以至千里 本文主要参考了算法导论一书...原创 2017-09-16 23:11:35 · 3890 阅读 · 2 评论 -
Treap(树堆)图解与实现
个人技术博客:http://blog.ztgreat.cn前面我们介绍了AVL树,伸展树,它们都是二叉搜索树,二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会很大,Treap树就是一种解决二叉搜索树可能深度过大的另一种数据结构。 Treap=Tree+Heap。Treap本身是一棵二叉搜索树,它的左子树和右子树也分别是一个Treap,和一般的二叉搜索树不同的是,Tre...原创 2015-11-03 19:30:13 · 12344 阅读 · 3 评论 -
伸展树(Splay tree)图解与实现
个人技术博客:http://blog.ztgreat.cn一、伸展树 本文介绍了二叉查找树的一种改进数据结构–伸展树(Splay Tree)。它的主要特点是不会保证树一直是平衡的,但各种操作的平摊时间复杂度是O(log n),因而,从平摊复杂度上看,二叉查找树也是一种平衡二叉树。另外,相比于其他树状数据结构(如红黑树,AVL树等),伸展树的空间要求与编程复杂度要小得多。伸展树...原创 2015-11-02 16:20:48 · 40512 阅读 · 24 评论 -
AC自动机算法
写在最前面的话参考并转载了部分飘过的小牛的博文,感觉挺好的,图文并茂,推荐学习的同学参考。AC自动机简介: 首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有字典树T原创 2015-07-29 15:10:21 · 707 阅读 · 0 评论 -
hiho一下 更为复杂的买卖房屋姿势(线段树)
时间限制:10000ms单点时限:1000ms内存限制:256MB描述小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们可以化身上帝模式,买卖房产。在这个游戏里,会不断的发生如下两种事件:一种是房屋自发的涨价或者降价,而另一种是政府有关部门针对房价的硬性调控。房价的变化自然影响到小Hi和小Ho的决策,所以他们希望能够知道任原创 2015-08-26 14:28:02 · 658 阅读 · 0 评论 -
hiho一下 KMP 算法
时间限制:1000ms单点时限:1000ms内存限制:256MB描述小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。这一天,他们遇到了一只河蟹,于是河蟹就向小Hi和小Ho提出了那个经典的问题:“小Hi和小Ho,你们能不能够判断一段文字(原串)里面是不是存在那么一些……特殊……的文字原创 2015-07-28 23:15:46 · 531 阅读 · 0 评论 -
hiho一下 连通性·四 点的双连通分量
hiho一下 连通性·四 点的双连通分量原创 2015-07-25 00:02:06 · 784 阅读 · 0 评论 -
hiho一下 连通性·三 强连通分量
时间限制:10000ms单点时限:1000ms内存限制:256MB描述暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家。今天一大早,约翰因为有事要出去,就拜托小Hi和小Ho忙帮放牧。约翰家一共有N个草场,每个草场有容量为W[i]的牧草,N个草场之间有M条单向的路径。小Hi和小Ho需要将牛羊群赶到草场上,当他们吃完一个草场牧草后,继原创 2015-07-17 14:20:16 · 1231 阅读 · 0 评论 -
hiho一下 连通性二·边的双连通分量
时间限制:10000ms单点时限:1000ms内存限制:256MB描述在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老师找到了小Hi和小Ho,希望他俩帮忙。老师告诉小Hi和小Ho:根据现在网络的情况,我们要将服务器进行分组,对于同一个组的服务器,应当满足:当组内任意一个连接断开之后,不会影响组内服务器的连通性。在满足以原创 2015-07-10 17:33:55 · 1209 阅读 · 0 评论 -
hiho一下 连通性一·割边与割点
描述还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢失。为了避免再次出现这样的情况,学校决定对校园网络进行重新设计。学校现在一共拥有N台服务器(编号1..N)以及M条连接,保证了任意两台服务器之间都能够通过连接直接或者间接的数据通讯。当发生黑客攻原创 2015-06-28 14:09:25 · 1299 阅读 · 2 评论 -
hiho一下 欧拉路三
hiho一下时间限制:10000ms单点时限:1000ms内存限制:256MB描述小Hi和小Ho破解了一道又一道难题,终于来到了最后一关。只要打开眼前的宝箱就可以通关这个游戏了。宝箱被一种奇怪的机关锁住:这个机关是一个圆环,一共有2^N个区域,每个区域都可以改变颜色,在黑白两种颜色之间切换。小Ho控制主角在周围探索了一下,果然又发现了原创 2015-06-25 14:05:36 · 648 阅读 · 0 评论 -
欧拉回路、欧拉路径
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。判断欧拉路是否存在的方法有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。 无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。 判断欧拉回路是否存在的方原创 2015-05-14 17:45:05 · 1026 阅读 · 0 评论 -
欧拉函数、费马定理、欧拉定理
在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。φ函数的值 Euler函数 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn) 其中p1, p2……pn为x的所有质因数,x是不为0的整数 φ(1)=1(唯一和1互质的数就是1本身)【注意:每种质因数只一个。比如12=2*2*3】原创 2014-11-06 19:44:41 · 2436 阅读 · 0 评论 -
MD5哈希算法学习
一.哈希函数简介二.MD5哈希算法流程 三.MD5分组过程四.MD5子明文分组和链接变量五.MD5第1轮运算六.MD5后3轮运算七.求和运算八、程序的实现九、MD5总结原创 2015-06-03 19:31:25 · 9590 阅读 · 2 评论 -
非对称加密算法RSA学习
RSA加密算法是最常用的非对称加密算法,RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。 RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表:RSA算法并不难,只需要一点数论知识就可以理解。一、互质关系这个很简单,这里原创 2015-05-08 20:46:25 · 1334 阅读 · 0 评论 -
hiho一下 Trie树
时间限制:10000ms单点时限:1000ms内存限制:256MB描述小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符串开头的所有单词呢?原创 2015-07-27 17:17:12 · 534 阅读 · 0 评论 -
矩阵 快速幂取模算法
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。以下以求a的b次方来介绍把b转换成二进制。该二进制数第i位的权为例如 11的二进制是101111 = 2³×1 + 2²×0 + 2¹×1 + 2º×1因此,我们将a¹¹转化为算----原创 2015-01-06 20:58:39 · 2206 阅读 · 0 评论 -
平衡二叉树(AVL)图解与实现
个人技术博客:http://blog.ztgreat.cn平衡二叉树(Balanced BinaryTree)又被称为AVL树。它具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 平衡二叉树一般是一个有序树,它具有二叉树的所有性质,其遍历操作和二叉树的遍历操作相同。但是由于其对二叉树施加了额外限制,因而其添加、删除操作都必须...原创 2015-10-31 21:31:14 · 65164 阅读 · 23 评论 -
图论--关键路径
拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题。如果我们要对一个流程图获得最短时间,就必须要分析它们的拓扑关系,并且找到当中最关键的流程,这个流程的时间就是最短时间。在前面讲了AOV网的基础上,来介绍一个新的概念。在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,称之为原创 2015-01-02 10:09:45 · 3039 阅读 · 0 评论 -
二叉堆之优先队列
一、优先队列不同于普通队列采用先进先出的队列元素存取方式。插入队列元素时按照一定的规则插入,每次都是取队列中优先级最高的元素。在操作系统中,调度程序必须决定在什么时候运行哪个进程。一般来说,短的作业是需要尽可能快地完成,也就是说,短的作业应该拥有优先权。这种特殊的应用将由一种特殊的队列来完成,这种数据结构叫做优先队列。二、最基本的两种操作 优先队列具备的最基本的两种操作,是插入和原创 2014-12-22 21:41:54 · 614 阅读 · 0 评论 -
根据二叉树的前序和中序求解树
求解方法类似于根据中序和后序求解树根据前序把中序分为左右子树,然后依次递归。前序:ABCDEFG中序:CBDEAFG#include #include #include using namespace std;typedef struct node{ char data; struct node *rchild,*lchild;}BiTNode,原创 2014-12-02 20:25:04 · 604 阅读 · 0 评论 -
根据二叉树的中序和后序求解树
参考:http://blog.csdn.net/wuchuanpingstone/article/details/6860453中序遍历:CBDEAFG后序遍历:CEDBGFA(1)先根据后序遍历结果找出树的根结点A。(2)然后将中序遍历分成三部分 CBDE A FG。(3)同样将后序结果分成 CEDB GF A三部分(根据左右子树结点个数相等分)。原创 2014-12-01 22:13:53 · 1260 阅读 · 0 评论 -
图论--拓扑排序及其应用
在⼯工程实践中,⼀一个⼯工程项⽬目往往由若⼲干个⼦子项⽬目组成。这些⼦子项⽬目间往往有两种关系:1先后关系,即必须在⼀一项 ⽬目完成拭⼀一,才能开始实施另⼀一个⼦子项⽬目;2⼦子项⽬目间⽆无关系,即两个⼦子项⽬目可以同时进⾏行,互不影响。⼯工⼚厂⾥里产品的⽣生 产线上,⼀一个产品由若⼲干个零部件组成。零部件⽣生产时,也存在这两种关系:先后关系,即⼀一个部件必须在完成后才能⽣生 产另⼀一个部件;部件原创 2014-11-06 10:29:57 · 9134 阅读 · 0 评论 -
图的单源最短路径SPFA算法
算法大致流程是用一个队列来进行维护。初始时将源加入队列。每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。直到队列为空时算法结束。这个算法,简单的说就是队列优化的bellman-ford,利用了每个点不会更新次数太多的特点发明的此算法SPFA——Shortest Path Faster Algorithm,它可以在O(kE)的时间复杂度内求原创 2014-10-27 00:30:54 · 668 阅读 · 0 评论 -
图的单源最短路径Bellman-Ford算法
Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。适用条件&范围:单源最短路径(从源点s到其它所有顶点v);有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图);边权可正可负(如有负权回路输出错误提示);原创 2014-10-26 17:06:22 · 1019 阅读 · 0 评论 -
前序线索化二叉树
#include using namespace std;enum PointerTag {Link,Thread}; //Link非线索标记,Thread线索标记typedef struct node{ char data; struct node *rchild; struct node *lchild; PointerTag Ltag原创 2014-10-24 19:48:59 · 1254 阅读 · 0 评论 -
中序线索化二叉树
先理解图,在看代码。#include using namespace std;typedef struct node{ char data; struct node *rchild; struct node *lchild; int rtag; // rtag=0时,表示Rchild指向该结点的右孩子;为1时,表示rchild指向该结点的线性后继结原创 2014-10-24 17:02:43 · 791 阅读 · 0 评论 -
Tarjan离线算法求最近公共祖先(LCA)
Problem DescriptionThere are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this "How far is it if I want to go from house A to house原创 2014-10-20 18:09:18 · 738 阅读 · 0 评论 -
扩展欧几里得算法
欧几里得算法欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。原创 2014-10-18 14:08:43 · 18691 阅读 · 3 评论 -
图的邻接表的实现(链表+数组)
图原创 2014-10-16 15:39:02 · 928 阅读 · 0 评论 -
最小生成树kruskal算法(并查集)
kruskal算法原创 2014-10-15 00:22:37 · 1033 阅读 · 0 评论 -
并查集(Union-Find)算法介绍
并查集原创 2014-10-11 21:18:21 · 1046 阅读 · 0 评论 -
最小生成树prim算法(贪心)
一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边。所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小。综合以上两个概念,我们可以得出:构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree)。Prim算法也是利用贪心算法来解决最小生成树。最小生成树MST性原创 2014-10-09 19:27:49 · 1559 阅读 · 1 评论 -
图的单源最短路径Dijkstra算法
单源最短路径问题给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数。另外,还给定 V 中的一个顶点,称为源。现在我们要计算从源到所有其他各顶点的最短路径长度。这里的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。原创 2014-10-09 00:49:55 · 1169 阅读 · 0 评论 -
二叉树的应用--哈夫曼树
哈夫曼树,最优二叉树。原创 2014-09-27 22:30:29 · 952 阅读 · 0 评论 -
二叉搜索树
二叉搜索树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉排序树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;二叉搜索树的结构:typ原创 2014-09-06 20:46:07 · 2502 阅读 · 1 评论 -
数据结构之堆排序
堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆(例如图9-7-2左图);或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆(例如图9-7-2右图)。 这里需要注意从堆的定义可知,根结点一定是堆中所有结点最大(小)者。较大(小)的结点靠近根结点(但也不绝对,比如右图小顶堆中60、40均小于70,但它们并没有70靠近根结点)原创 2014-09-06 16:25:16 · 955 阅读 · 0 评论 -
数据结构之归并排序
归并排序中的基本操作是合并两个yi原创 2014-08-26 11:23:59 · 489 阅读 · 0 评论 -
二叉树的创建,及遍历 操作
#include #include #include typedef char DataType;#define MaxSize 100using namespace std;typedef struct Node //二叉链表存储结构类型定义{ DataType data; //数据域 struct Node *lchild; //指向左孩子结点 stru原创 2014-08-15 20:54:21 · 1610 阅读 · 0 评论