- 博客(5)
- 收藏
- 关注
原创 AVL树(平衡二叉树)
AVL树是排序二叉树的优化版,多了个调整操作,排序二叉树在某些情况下可能会变的跟链表差不多,比如连续插入多个非递减的数: 这就会使得各种操作非常费时间,几乎和链表一样。但是AVL树避免了这一点,保证了任意一个节点的左右儿子节点的高度差不会超过1,这就使得AVL树的复杂度很平衡(插入删除查找log(n))。 这里的调整操作是基于两个旋转操作来进行的,即左旋和右旋: 右旋: 左旋(实际上
2016-09-29 23:33:56 442
原创 AC自动机
问题:有多个单词,然后给出一个较长的字符串,问有多少个单词出现在这个字符串里面。这里要用到的就是AC自动机,AC自动机需要KMP和字典树知识,最好把这两样都弄懂了。 AC自动机其实就是字典树里面再加一个fail指针,这个fail指针的用处就是当当前字符无法被匹配时所要进行的转移,很想KMP算法里面的next数组,比如对于单词:qwert, wert, ert所构成的字典树如下:(世上最丑作图。。丑
2016-09-25 23:13:31 572
原创 KMP算法
KMP算法是一个快速的字符串匹配算法,比如要在字符串s中判断是否存在字符串t,最最简单的算法就是暴力的搜一遍,但是暴力的复杂度太高,最坏达到了O(n*m)(n是s的长度,m是t的长度)的复杂度,在n m都较大的情况下暴力算法很耗时间。而kmp算法可以大大优化复杂度,可以达到O(n+m)的复杂度。 KMP算法的核心是求出next数组,next数组就是在进行匹配某一位置的字符时如果匹配失败的话所进行的
2016-09-23 20:19:52 340
原创 归并排序
归并排序的思想是分治,即将大问题分解成小问题然后逐一解决,该算法先将所有数分成两个两个的很多份,然后两个两个的排序,然后将两个两个的合并成四个四个的,然后再排序,然后再合并成八个八个的再排序,那么如何将n个n(n=2,4,8,16…..)个的合并呢?原理就是例如对于四个四个的合并,由于之前两个四个数的序列是有序的,那么可以在O(n)的复杂度内将两个有序的序列合并成一个有序的序列,这就是归并排序的思想
2016-09-20 21:56:27 334
原创 伸展树(splay树)
在各种各样的数据结构中,有很多树,可以查找第k大的数,比如划分树,查找区间最大值,比如线段树,但是绝大部分的树形数据结构都不能进行区间删除,但是有一种数据结构能进行区间删除,还能进行树的合并,它既是伸展树。 伸展树跟平衡树等类似,也是一颗有序的二叉树,也有左旋右旋操作,查找插入删除等操作的平均复杂度也是log(n)级别的,他的特点就是在进行在对某个数进行操作时会将这个数旋转到树根的地方,这一特点就
2016-09-19 23:28:16 491
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人