- 博客(29)
- 收藏
- 关注
转载 Trie树
Trie树,即字典树或单词查找树,主要用于大量字符串的检索、去重、排序等操作。主要原理就是利用字符串的公共前缀建立一棵多叉树,牺牲空间换取时间。 1 //Trie树 2 #include <iostream> 3 #include <string> 4 using std::cin; 5 using std::cout; 6 usi...
2017-07-17 22:04:00
122
转载 字符串匹配
这里介绍两种常见算法, Brute Force和KMP.代码如下: 1 //字符串匹配 2 //Brute Force 3 class StringPattern { 4 private: 5 string value; 6 public: 7 StringPattern(const string &input)...
2017-07-16 23:29:00
142
转载 堆(优先队列)求huffman WPL
huffman编码中WPL等于没个结点到根结点的距离乘结点权值的总和,但我们也可以用另一种方法求WPL:如果huffman树只有一个结点,则WPL为根结点权值,否则WPL等于除了根结点以外的所有结点的权值之和。我们可以用优先队列/堆实现这个过程: 1 //用优先队列求huffman编码中的WPL 2 #include <iostream> 3 using ...
2017-07-16 12:03:00
188
转载 堆
堆(heap)本质上是一棵完全二叉树。它分为大根堆和小根堆,对于大根堆,越接近顶部的结点权值越大,并且一个结点的权值一定大于等于它所在的子树的所有结点的权值。小根堆类似,结点的权值小于等于子树结点的权值。用堆可以完成堆排序,过程类似于选择排序,每次将最大的元素移到最后位置然后再维护堆,复杂度为O(nlogn).基本操作如下: 1 #include <iostream...
2017-07-16 10:17:00
101
转载 三分查找
可以用三分法求一个凸函数或者凹函数的最大或最小值。主要思路是对整个区间进行三等分,切分点记为m1, m2,以凸函数为例,如果f(m1)>f(m2),最大值一定不会在 [m2, right],所以右界可以更新为m2,类似的,如果f(m1)<f(m2),最大值一定不会在 [left, m1],所以左界可以更新为m1,如果f(m1)==f(m2),则两个更新任选其一即可。有...
2017-07-10 20:08:00
117
转载 分块查找
分块查找将一个线性表分成若干个子表,查找时先确定目标元素所在的子表,再在该子表中查找它。我们通常会先建立一个索引表,每个元素包含每个子表的起始位置和子表中最大元素值。整个线性表要求分块排序,即第i个子表中所有元素都小于第i+1个子表中所有元素。但是在每个子表内,元素排序是任意的,所以在子表中用顺序查找。下面给出了一个简单的例子: 1 //分块查找, blocking se...
2017-07-09 10:24:00
239
转载 哈希表的简单操作
哈希表中,关键值通过哈希函数映射到数组上,查找时通过关键值直接访问数组。哈希表的关键问题在于哈希函数的构造和解决冲突的方法。下面采用最简单的线性探测展示一下哈希表的基本操作: 1 //Hashtable 2 class HashTable { 3 private: 4 string *elem; 5 int size; 6 pu...
2017-07-06 22:24:00
187
转载 dijkstra求最短路
dijkstra和Prim很像,区别在于Prim在找到离MST最近的结点后把它加入MST并更新与此结点相邻的结点离MST的最短距离;而dijsktra中,找到当前离起点最近的结点后,更新与它相邻的结点距离起点的最短距离和最短路径。代码如下: 1 //dijkstra 2 #include <iostream> 3 #include <cstring&...
2017-07-04 17:50:00
95
转载 Prim和Kruskal算法
对于一个边带有权值的图,我们可以求它的最小生成树(Minimum Spanning Tree)。通常有两种算法,Prim和Kruskal。Prim算法的思路是每次找到距离当前生成树最近的一个结点,并将它连到当前的生成树。代码如下: 1 //Prim 2 #include <iostream> 3 #include <cstring> ...
2017-07-04 17:33:00
107
转载 Floodfill求连通分量
floodfill的基本思路就是找到所有连在一起的结点并染成相同的颜色,这样就可以通过颜色区分各个连通分量。具体来说,一开始把所有结点都设成相同的颜色,然后从第一个结点往后遍历,遇到还未被染成其他色的结点,表明这个结点不属于任何已知的连通分量,所以给它一个新颜色,并用bfs/dfs给与其相连的所有结点都染成这个颜色。代码如下: 1 //邻接链表实现floodfill 2 ...
2017-07-04 17:16:00
193
转载 bfs求最短路的几道例题
题目来自于记蒜客数据结构课,类型差不多,都是用bfs求最短路(注意是不加权的最短路,加权的情况后面的文章会讲)。代码如下: 1 //记蒜客习题 2 //bfs求某点到其他各点的最短距离 3 #include <iostream> 4 #include <cstring> 5 #include <queue> ...
2017-07-04 17:07:00
229
转载 并查集
我们可以在一开始把每个元素都看成一棵树,并且根结点的父结点指向自己,在此基础上完成查找、合并操作。两种优化方法:第一种按秩合并,即每次都把较矮的树并到较高的树中。第二种路径压缩,即让所有的并入的结点都指向整棵树的根结点。具体代码如下: 1 //并查集 2 class DisjointSet { 3 private: 4 //rank is the he...
2017-07-03 18:53:00
82
转载 图的两种遍历方式
图的遍历有两种:深度优先和广度优先。本文中,深度优先使用递归实现,每次递归找到第一个与当前结点相连且未输出过的结点继续往下递归,直至所有结点都已输出。广度优先将开始结点的所有邻接结点全部压入栈,当栈不为空时一直循环将栈首的结点的所有相邻结点压入栈。具体代码实现如下: 1 //邻接链表 2 class Graph { 3 private: 4 //n...
2017-06-28 12:49:00
363
转载 邻接矩阵和邻接表
图有两种存储方式,邻接表和邻接矩阵。稀疏图一般用邻接链表,稠密图一般用邻接矩阵。具体实现如下: 1 //图 2 //邻接矩阵 3 class Graph { 4 private: 5 //指向邻接矩阵 6 int **mat; 7 //n为顶点个数 8 int n; 9 public: ...
2017-06-25 19:08:00
215
转载 Size Balanced Tree
SBT是一种平衡二叉树结构,它与AVL的不同在于它的自平衡条件是结点的size大于等于其侄子结点的size。SBT的旋转操作与AVL类似,但是有一种较为简便的maintain方法。由于在结点类中包含了结点的size(它所在的子树的结点个数),我们可以轻易地求得结点数据从小到大的rank并找到第k小的结点。具体代码如下: 1 //SBTree 2 #include ...
2017-06-23 11:35:00
122
转载 AVL树
AVL树是一种自平衡二叉查找树。它的平衡因子等于它的左子树的高度减去它的右子树的高度。只有平衡因子等于1,0,-1的结点是平衡的,不平衡的结点需要通过旋转来保持平衡。因此,在AVL树中任何结点的两个子树的高度差的最大值为1。google到了一篇代码很简洁易懂的文章,将其中的代码整理了一下: 1 //AVL Tree 2 #include <iostream>...
2017-06-20 19:15:00
83
转载 二叉查找树
二叉查找树的结构和普通二叉树相同。它要么是空树,要么满足:对任意结点,如果左子树不为空,则左子树上所有结点的权值都小于该结点的权值;如果右子树不为空,则右子树上所有结点的权值都大于该结点的权值。在二叉查找树中,任意结点的左子树和右子树都是一棵二叉查找树。一般而言,二叉树上结点的权值都是唯一的。基本操作: 1 //二叉查找树 2 //结点定义 3 template...
2017-06-18 22:15:00
97
转载 二叉树基本操作2
1 //删除以cur为根结点的树 2 void delete_tree(node *&cur){ 3 if(cur!=NULL){ 4 delete_tree(cur->lchild); 5 delete_tree(cur->rchild); 6 //delete只是释放内存...
2017-06-17 20:39:00
142
转载 二叉树和广义表的转换
1 //广义表转二叉树: 2 设置一个标记变量k,初始值为-1; 3 设置一个标记结点p; 4 循环遍历广义表的字符串str; 5 如果str[i]是左括号: 6 则设置k为0; 7 把p压入栈中。 8 否则如果str[i]是逗号: 9 则设置k为1。 10 ...
2017-06-16 10:44:00
1288
转载 二叉树基本操作 part1
二叉树的存储结构有两种。第一种是顺序存储结构。若对一棵具有n个结点的完全二叉树的所有结点按层从上到下,每层从左到右的顺序依次对结点从1开始编号,则编号为i的结点具有以下性质:1.i=1的结点为二叉树的根结点。2.如果i>1,则结点i的双亲结点编号为i/2(向下取整)。3.如果2i<=n,则编号为i的结点的左孩子结点编号为2i;如果2i>n,则该结点没有左孩子...
2017-06-15 16:06:00
491
转载 用栈实现队列
用两个栈实现栈的思路如下:栈s1装新压入的元素,顺序是“倒过来的”(先进后出),要出栈的话就把s1存的元素倒入s2中,这时候s2中的元素的出栈顺序与队列的出队顺序相同。执行的步骤如下:1. 入队时,检测s1是否已满,未满则入栈。 2. 出队时,检测s2中是否还有元素,若不为空,直接出栈即可;若s2为空,将s1中的元素倒入s2后再弹出s2的栈顶。具体代码如下: 1 #incl...
2017-06-13 18:42:00
92
转载 队列基本操作
队列是一种元素先进先出(FIFO)的线性结构,与栈不同的是,队列在队尾插入元素,在队首删除元素。这里我们实现的是循环队列,以防止“假上溢”浪费空间。 1 //队列基本操作 2 template <typename Type> class Queue { 3 private: 4 Type *data; 5 int head, tail,...
2017-06-13 15:34:00
119
转载 单调栈解木板倒水问题
题目描述:地上从左到右竖立着 n 块木板,从 1 到 n 依次编号,如下图所示。我们知道每块木板的高度,在第 n 块木板右侧竖立着一块高度无限大的木板,现对每块木板依次做如下的操作:对于第 i 块木板,我们从其右侧开始倒水,直到水的高度等于第 i 块木板的高度,倒入的水会淹没 ai 块木板(如果木板左右两侧水的高度大于等于木板高度即视为木板被淹没),求 n 次操作后,所有 ai 的和...
2017-06-13 14:35:00
392
转载 栈实现表达式求值
本文简单的设计了一个针对一位整数的四则运算进行求值的算法,对于处理多位整数的四则运算,需要对本文接受输入的数据类型进行升级,把字符数组换成字符串数组,将一个整数的多位数字存入一个字符串进行处理。代码如下: 1 //用栈实现表达式求值(简化版) 2 #include<iostream> 3 #include<string> 4 #in...
2017-06-13 12:11:00
198
转载 栈的基本操作
栈是一种元素满足后进先出(LIFO)规则的线性表。一般来说,我们将表头称为栈底,表尾称为栈顶,栈的操作都是在栈顶进行的。栈的基本操作如下: 1 //栈的基本操作 2 template <typename Type> class Stack{ 3 private: 4 Type *elements; 5 int max_size,to...
2017-06-13 01:10:00
124
转载 有环单链表
单链表有环的情况如上图所示,循环链表也属于有环的链表。这里我们使用追逐法判断一个链表是否有环:设置两个指针slow和fast从头节点开始,slow每次移动一个节点,fast每次移动两个节点,如果fast遇到了NULL则表明链表没有环,停止循环。如果链表有环的话,那么这两个指针总会在某个位置相遇,相遇后停止循环。代码如下: 1 //追逐法判断链表是否有环 2 ...
2017-06-12 21:02:00
205
转载 用循环链表解决约瑟夫环问题
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。下面我们用循环列表模拟这个过程: 1 //节点定义与单链表相同,在此省略 2 //use cyclical linked list to s...
2017-06-11 23:32:00
276
转载 链表1-单链表
链表也是一种线性表,但与线性表不同的是,链表的物理存储结构是一堆地址任意的存储单元。也就是说,链表的数据在内存中的物理位置可能相互邻接,也有可能不邻接。单链表的基本操作如下: 1 //链表的基本操作 2 //定义结点类 3 template <typename Type> class Node{ 4 public: 5 Type ...
2017-06-10 21:32:00
79
转载 线性表1-顺序表
顺序表属于线性表的一种存储表现形式,在计算机内部表示为一段连续的内存空间,数组就是一种顺序表。下面是顺序表的主要操作: 1 //顺序表的基本操作 2 template <typename Type> class Vector { 3 private: 4 //size为容量,length为当前元素个数 5 int size...
2017-06-10 19:35:00
77
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人