![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 78
xkey
AC
展开
-
随机二叉平衡树treap个人总结
二叉查找树二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。二叉查找树代码很好写,这里就不过多介绍,现在分析二叉查找树的性能:二叉查找树在最坏情况下,可能退原创 2011-10-27 16:37:27 · 5281 阅读 · 3 评论 -
C++库函数next_permutation的递归实现(数组全排列)
今天下午去了学校的机房,闲着没事做,和同学开了个VC6.0在那敲代码玩,最后同学说敲全排列吧,那就敲吧。开始写了个纯的next_permutation函数的实现形式,但是是不能判重的,以前看过一个可以判重的代码,但是感觉写的比较烦,然后就没看了,所以说我今天之前就是不会写的,惭愧啊,要是那天面试考到这种弱智题我就傻B了,不扯淡了,上代码。开始来个丑陋的代码鄙视下自己void permu原创 2011-12-03 00:31:30 · 2727 阅读 · 0 评论 -
Toposort(拓扑排序)——DFS递归回溯版
拓扑排序简单来说就是把一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面。 拓扑排序最大的用途就是判断一个有向图是否有环,当然判断还有一种方法就是Floyd算法。如果用邻接表的话拓扑排序的时间复杂度是O(N*E),邻接矩阵是O(N^2),N表示顶点数,E表示边数,Floyd时间复杂度是O(N^3)。性质1、 拓扑排序在有向无环图中才能排出有效的序列,否则能判断该原创 2011-11-11 15:19:39 · 13120 阅读 · 3 评论 -
字典树的简单介绍及其如何求最短前缀
Trie,又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串,其核心思想是空间换时间。它的优点是:利用字符串的公共前缀来节约存储空间。假设有b,abc,abd,bcd,abcd,efg,hii这6个单词,我们构建的树就是这样的对于每一个节点,从根遍历到他的过程就是一个单词,如果这个节点被标记为红色,就表示这个单词存在,否则不存在。那么,对于一个单词,我只要顺着他从原创 2011-11-08 19:46:08 · 2454 阅读 · 0 评论 -
Python实现优先队列
Python有队列类Queue,为啥就不提供个PriorityQueue类呢?写优先队列也是在写爬虫的时候想到的,当时没想用PageRank算法(最终也没用),就直接用优先队列来放URL,但是发现Python没有优先队列。网上我看到一哥们用Python的bisect包来实现优先队列的具体的网址:http://www.kgblog.net/2009/04/25/pythonSpider.原创 2012-03-24 17:05:26 · 6832 阅读 · 2 评论 -
算法导论标准版快速排序和线性时间求解数组第K小数
想想写代码也3年多了,虽然能够理解快速排序的思想,但是从来没有写过一次标准版的快速排序代码,因此今天准备写下。快排的思想可以简单说明为:首选在数组中选取一个数,比这个数小的全部放到左边,比这个数大的全部放到右边,然后在递归左边和右边重复该过程,就能将数组排序了。快速排序的Partition过程如下:int partition(int a[],int l,int r){ swap原创 2011-11-29 16:46:38 · 2159 阅读 · 0 评论 -
Skip List跳跃表代码实现
Skip List相关知识介绍:http://blog.nosqlfan.com/html/3041.html http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html#include #include #include #include using namespace std;#define MAX_原创 2013-05-13 23:15:16 · 3757 阅读 · 4 评论 -
Splay Tree源码
注:此代码非本人所写,实现方式为自底向上,在做ACM题目时比教科书上的自顶向下在数据处理上要好操作。由于个人现在比较钟爱指针,所以从网上找了个指针实现的源码,只是添加了点个人的理解注释和一些其他操作。http://dongxicheng.org/structure/splay-tree/此博客对Splay Treee分析比较透彻,需要注意的是,Splay Tree的旋转操作与其他平衡树如R原创 2013-05-30 20:58:38 · 1992 阅读 · 0 评论 -
布隆过滤器(Bloom Filter)Java实现
布隆过滤器原理很简单:就是把一个字符串哈希成一个整数key,然后选取一个很长的比特序列,开始都是0,在key把此位置的0变为1;下次进来一个字符串,哈希之后的值key,如果在此比特位上的值也是1,那么就说明这个字符串存在了。如果按照上面的做法,那就和哈希算法没有什么区别了,哈希算法还有重复的呢。布隆过滤器是将一个字符串哈希成多个key,我还是按照书上的说吧。先建立一个16亿二进制常量,原创 2011-12-01 18:22:33 · 15005 阅读 · 6 评论 -
bitmap与2bitmap实现
Bitmap就是用一个bit位来标记某个元素是否存在,而2Bitmap就是用两个bit为来标记某个元素的个数,00,01,10,11(分别表示0,1,2,3,0表示不存在,1表示存在1次,后面依次)。Bitmap能用来处理下面的两个问题:(1)、在2.5亿个整数找出不重复的整数,内存不足以容纳着2.5亿个整数(2)、腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序原创 2013-06-04 21:06:28 · 6065 阅读 · 1 评论 -
Tarjan的脱机最小公共祖先算法
在一棵有根树T中,两个节点u和v的最小公共祖先是指这样的一个节点w,它是u和v的祖先,并且在树T中具有最大深度。Tarjan思想求LCA是从根节点x开始搜索每一棵子树(节点设为y),那么在回溯回子树根节点y的时候就能保证以该子树的全部节点搜索完了,在每搜索完一个子树,那么该子树内的所有LCA(u,v)的问题都已经解决了,其他的LCA询问肯定在另外的子树上,那么这时就把y放入到合并的集合中,这样原创 2011-11-10 16:30:34 · 1824 阅读 · 0 评论 -
二项堆
二项堆是可合并堆的数据结构,应该功能应该类似左偏树。二项树二项树Bk是一种递归定义的有序树,如下图所示。a)二项树Bk的递归定义,三角形表示有根的子树,b)二项树B0至B4,B4中显示出了各节点的深度,c)以另一种方式来看二项树Bk二项树的性质:1)共有2k个结点。2)树的高度为k。3)在深度i处恰有Cik个结点。4)根的度数原创 2011-11-09 13:38:58 · 3586 阅读 · 5 评论 -
红黑树笔记——红黑树的插入操作
红黑树的插入操作可以在O(logn)的时间内完成。开始插入节点的时候和二叉查找树一样,只需要最后将插入的节点着成红色,为了保证红黑树的性质,需要通过RB_InsertFixUp函数来调整该节点,对其重新着色并旋转。下面先调用RB_Insert()函数将一个节点插入到红黑树中,同样先上伪代码RB-INSERT(T, z) 1 y ← nil[T] 2 x ← root[T]...原创 2011-10-28 17:18:57 · 2301 阅读 · 0 评论 -
poj 2892 随机平衡二叉树的解法
这种题就是标准的模板题,只要一个Treap上去就AC了,所以没有什么价值,唯一的价值就是用来学习Treap前驱和后继函数在动态数据中的应用。首先解释下题目意思:输入n和m,你表示数轴的长度,当然这里的数轴是从1开始的正整数,m表示接下来有m个操作。D x: The x-th village was destroyed. 就是摧毁数轴上的x值Q x: The Army comma原创 2011-10-27 20:47:08 · 1576 阅读 · 0 评论 -
poj 1442 第K小数(输入的数可能有重复)
题目意思很简单直接拿样例来解释吧7 43 1 -4 2 8 -1000 21 2 6 6输入 n = 7 m =4,然后第一行输入n个数,然后另一行输入m个数index = 11:输出n个数中前1个数中的第Index(1)小值index=22:输出n个数中前2个数中的第index(2)小值index=36:输出n个数中前6个数中的第index(3)小值原创 2011-10-29 00:57:27 · 1645 阅读 · 0 评论 -
Size Balanced Tree(SBT)平衡二叉树
定义数据结构struct SBT{ int key,left,right,size;} tree[N];key:存储值,left,right:左右子树,size:保持平衡最终要的数据,表示子树的大小SBT树的性质定义一个节点x,同时满足下面两个条件(a)、x.left.size >= max(x.right.right.size, x.right.left.si原创 2011-10-31 15:38:50 · 13265 阅读 · 6 评论 -
图解线段树解约瑟夫环问题
算导上有这样一道题,假设n个人站成环形,且有一个正整数m例如,(7,3)-Josephus排列为(3,6,2,7,5,1,4)。设计一个算法,时间复杂度要求O(nlogn)时间,使给定的整数n和m,输出(n,m)-Josephus排列。对于约瑟夫环问题,如果是求最后一个出列的人,有O(n)的算法,这里就不介绍。这里如果我们用循环队列来模拟的话,很明显时间复杂度是O(nm)的原创 2011-11-01 22:23:29 · 4637 阅读 · 1 评论 -
线段树成段更新操作及Lazy思想(POJ3468解题报告)
就直接那POJ上面的例题来说吧,http://poj.org/problem?id=3468。此题题意很好懂: 给你N个数,Q个操作,操作有两种,‘Q a b ’是询问a~b这段数的和,‘C a b c’是把a~b这段数都加上c。需要用到线段树的,update:成段增减,query:区间求和介绍Lazy思想:lazy-tag思想,记录每一个线段树节点的变化值,当这部分线段的一致原创 2011-11-03 20:37:30 · 12763 阅读 · 3 评论 -
区间第K大数——划分树(POJ2104解题报告)
百度百科:划分树是一种基于线段树的数据结构。主要用于快速求出(在log(n)的时间复杂度内)序列区间的第k大值。划分树的基本思想就是对于某个区间,把它划分成两个子区间,左边区间的数小于右边区间的数。查找的时候通过记录进入左子树的数的个数,确定下一个查找区间,最后范围缩小到1,就找到了。建树划分树建树的时间复杂度和线段树不同,划分树是O(nlogn),划分树的建树依赖一个排好序的数组原创 2011-11-04 21:05:58 · 4988 阅读 · 5 评论 -
hdu3911线段树区间合并操作
线段树题目的类型大致可以分为四种:单点更新、成段增减或更新、区间合并和扫描线成段更新和区间合并都需要用到Lazy思想。扫描线就是求矩形面积和周长的题目,需要用到离散化。本篇讲解区间合并,区间合并肯定是从子节点向上才能用着合并,这类题目都是求最长连续区间的,主要在PushUp的时候需要对左右儿子的区间进行合并。这里就直接拿题目说事,所有的解释全部在代码的注释里。41 0 1原创 2011-11-05 15:17:31 · 3036 阅读 · 1 评论 -
堆排序与第K小数最大顶堆
#include #include using namespace std;int a[100];void swap(int &x ,int &y){ int temp; temp = x; x = y; y = temp;}void heap_adjust(int root,int n){//max heap int j = root <原创 2013-06-24 00:34:26 · 2890 阅读 · 2 评论