摘要: Trie树,即字典树或单词查找树,主要用于大量字符串的检索、去重、排序等操作。 主要原理就是利用字符串的公共前缀建立一棵多叉树,牺牲空间换取时间。 用Trie树求一个string的所有不相同的子串: 阅读全文
posted @ 2017-07-17 22:04 NoviScl 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 这里介绍两种常见算法, Brute Force和KMP. 代码如下: 阅读全文
posted @ 2017-07-16 23:29 NoviScl 阅读(167) 评论(0) 推荐(0) 编辑
摘要: huffman编码中WPL等于没个结点到根结点的距离乘结点权值的总和,但我们也可以用另一种方法求WPL:如果huffman树只有一个结点,则WPL为根结点权值,否则WPL等于除了根结点以外的所有结点的权值之和。 我们可以用优先队列/堆实现这个过程: 阅读全文
posted @ 2017-07-16 12:03 NoviScl 阅读(356) 评论(0) 推荐(0) 编辑
摘要: 堆(heap)本质上是一棵完全二叉树。它分为大根堆和小根堆,对于大根堆,越接近顶部的结点权值越大,并且一个结点的权值一定大于等于它所在的子树的所有结点的权值。小根堆类似,结点的权值小于等于子树结点的权值。 用堆可以完成堆排序,过程类似于选择排序,每次将最大的元素移到最后位置然后再维护堆,复杂度为O( 阅读全文
posted @ 2017-07-16 10:17 NoviScl 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 可以用三分法求一个凸函数或者凹函数的最大或最小值。 主要思路是对整个区间进行三等分,切分点记为m1, m2,以凸函数为例,如果f(m1)>f(m2),最大值一定不会在 [m2, right],所以右界可以更新为m2,类似的,如果f(m1)<f(m2),最大值一定不会在 [left, m1],所以左界 阅读全文
posted @ 2017-07-10 20:08 NoviScl 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 分块查找将一个线性表分成若干个子表,查找时先确定目标元素所在的子表,再在该子表中查找它。我们通常会先建立一个索引表,每个元素包含每个子表的起始位置和子表中最大元素值。 整个线性表要求分块排序,即第i个子表中所有元素都小于第i+1个子表中所有元素。但是在每个子表内,元素排序是任意的,所以在子表中用顺序 阅读全文
posted @ 2017-07-09 10:24 NoviScl 阅读(329) 评论(0) 推荐(0) 编辑
摘要: 哈希表中,关键值通过哈希函数映射到数组上,查找时通过关键值直接访问数组。哈希表的关键问题在于哈希函数的构造和解决冲突的方法。 下面采用最简单的线性探测展示一下哈希表的基本操作: 阅读全文
posted @ 2017-07-06 22:24 NoviScl 阅读(184) 评论(0) 推荐(0) 编辑
摘要: dijkstra和Prim很像,区别在于Prim在找到离MST最近的结点后把它加入MST并更新与此结点相邻的结点离MST的最短距离;而dijsktra中,找到当前离起点最近的结点后,更新与它相邻的结点距离起点的最短距离和最短路径。 代码如下: 阅读全文
posted @ 2017-07-04 17:50 NoviScl 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 对于一个边带有权值的图,我们可以求它的最小生成树(Minimum Spanning Tree)。通常有两种算法,Prim和Kruskal。 Prim算法的思路是每次找到距离当前生成树最近的一个结点,并将它连到当前的生成树。 代码如下: Kruskal的思路是每次找到剩余的权值最小的边,如果这条边与当 阅读全文
posted @ 2017-07-04 17:33 NoviScl 阅读(214) 评论(0) 推荐(0) 编辑
摘要: floodfill的基本思路就是找到所有连在一起的结点并染成相同的颜色,这样就可以通过颜色区分各个连通分量。具体来说,一开始把所有结点都设成相同的颜色,然后从第一个结点往后遍历,遇到还未被染成其他色的结点,表明这个结点不属于任何已知的连通分量,所以给它一个新颜色,并用bfs/dfs给与其相连的所有结 阅读全文
posted @ 2017-07-04 17:16 NoviScl 阅读(217) 评论(0) 推荐(0) 编辑