数据结构(总)
xindoo
10年技术博主,博客专家,曾就职于阿里 小米,目前任贝壳资深工程师。拥有运维、搜索广告、后端业务相关工作经验,擅长Java、Lniux、Redis……
展开
-
计算机科学中的树
二叉树▪ 二叉树 ▪ 二叉查找树 ▪ 笛卡尔树 ▪ Top tree ▪ T树自平衡二叉查找树▪ AA树 ▪ AVL树 ▪ 红黑树 ▪ 伸展树 ▪ 树堆 ▪ 节点大小平衡树B树▪ B树 ▪ B+树 ▪ B*树 ▪ Bx树 ▪ UB树 ▪ 2-3树 ▪ 2-3-4树 ▪ (a,b)-树 ▪ Dancing tree ▪ H树Trie▪ 前缀树 ▪ 后缀树 ▪ 基数原创 2013-04-04 22:35:04 · 2544 阅读 · 0 评论 -
Light oj 1080 - Binary Simulation(树状数组区间更新点查询)
题目链接题意: 有一字符串只包含0和1,然后又m组操作,I L R是将从L到R的字符进行翻转操作0变为1、1变为0,Q x表示询问第x的字符。思路: 我们只需要计算对询问的字符进行了多少次翻转,如果是偶数次,该字符变,否则翻转。对于区间的更新,我们可以使用线段树,不过对于这个题,因为只是对点的查询,而且每个节点的初始值都相同,为0,因此我们可以直接使用树状数组。下面是一原创 2013-04-12 18:58:51 · 2366 阅读 · 0 评论 -
Light oj 1112 - Curious Robin Hood(树状数组)
题意: 有n个数,有m组操作,1 i表示将第i个数先输出,然后置0, 2 i v 表示给第i个数加上v, 3 i j 表示求i 到 j 的和,注意,这里数组是从0开始的,而我们构造的树状数组是从1开始的,使用在程序中要进行一定的处理。//LA 1112 - Curious Robin Hood(树状数组)//2013-04-13-08.22#include #include原创 2013-04-13 00:23:13 · 2115 阅读 · 0 评论 -
Light oj 1082 - Array Queries(区间最小值)
题目链接线段树解法#include #include using namespace std;const int maxn = 100010;struct node{ int l, r, mid, minn;}tree[maxn<<2];int a[maxn];void build(int l, int r, int o){ tree[o].l = l原创 2013-04-12 13:24:30 · 2122 阅读 · 0 评论 -
POJ数据结构专辑(含部分题解)
1195 Mobile phones 树状数组 题解1455 Crazy tea party1521 Entropy huffman 题解1703 Find t原创 2013-04-04 20:38:50 · 2866 阅读 · 0 评论 -
归并树&划分树详解
先放一张图片对4 5 2 8 7 6 1 3 分别建划分树和归并树划分树如下图红色的点是此节点中被划分到左子树的点。 我们一般用一个结构体数组来保存每个节点,和线段树不同的是,线段树每个节点值保存一段的起始位置和结束位置,而在划分树和递归树中,每个节点的每个元素都是要保存的。为了直观些,我们可以定义一个结构体数组,一个结构体中保存的是一层的元素和到某个节点进入左子原创 2013-04-16 21:24:17 · 5591 阅读 · 0 评论 -
poj 1455 Crazy tea party
这道题第一眼看去很难,其实不然,短短几行代码就搞定了。 说一下大概思路,如果是排成一排的n个人,如 1 2 3 4 5 6 7 8 我们要变成 8 7 6 5 4 3 2 1 需要交换 28次,找规律的话就是 n*(n-1)/2,但这道题是一个圈,要让他们顺序变反的话不一定1要在8的位置上去,4 3 2 1 8 7 6 5 这样也是反的,我们只要把n个人分成两部分,然后按拍成一条线的方法原创 2013-10-03 16:34:11 · 1887 阅读 · 0 评论 -
codeforces 339 D.Xenia and Bit Operations(线段树)
这个题目属于线段树的点更新区间查询,而且查的是整个区间,其实不用写query()函数,只需要输出根节点保存的值就可以了。题意: 输入n,m表示有2^n个数和m个更新,每次更新只把p位置的值改成b,然后输出整个序列运算后的值,而这个运算就比较复杂了, 最下面一层两个数字之间或运算得到原来数目一半的数字,然后两个之间异或运算,得到一半,再或再异或………………,一直到得到一个数字,这个数原创 2013-08-27 11:19:47 · 2138 阅读 · 0 评论 -
poj 2823 Sliding Window
在这里先说一道微软的面试题目———《队列中的最大值》 让你设计一个队列,是其求里面最大值的时间复杂度尽可能的低,但这个队列除了最大值外,就是一个普通的队列,该怎么进出还是怎么进出,并不是优先队列。 对于一堆树,我们求其中最大值一般都会直接遍历一次,然后找到最大值,这样的话时间复杂度是O(n),如果在这道题里面用这种方法总的时间复杂度会到O(n^2),考虑到n的大小,这种原创 2013-08-04 19:02:39 · 2062 阅读 · 1 评论 -
POJ 1195 Mobile phones (二维树状树组)
由于英语极差,看了半天也没看懂题目,最后参考了其他人的题解才搞懂题目,我就直接把题意贴过来了 题意:这道题目只是题意自己就去理解了半天,大概题意如下:给出i一个n*n的矩阵,初始化为均为0,还有关于这个矩阵的几种操作,操作如下:命令1:(X Y A)对位于坐标(X Y)的值加A;命令2:(L B R T)求出位于L 思路分析如下:二维树状数组,典型的动态操作题目。查询原创 2013-04-05 10:55:38 · 1993 阅读 · 0 评论 -
poj 1961 Period(kmp最短循环节)
题目链接 DescriptionFor each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. T原创 2013-04-06 14:57:31 · 2332 阅读 · 0 评论 -
ZOJ1117 POJ1521 HDU1053 Huffman编码
题目链接 DescriptionAn entropy encoder is a data encoding method that achieves lossless data compression by encoding a message with "wasted" or "extra" information removed. In other words, entro原创 2013-04-05 15:56:38 · 2515 阅读 · 0 评论 -
poj 并查集小结
并查集小结并查集大体分为三个:普通的并查集,带种类的并查集,扩展的并查集(主要是必须指定合并时的父子关系,或者统计一些数据,比如此集合内的元素数目。)POJ-1182经典的种类并查集POJ-1308用并查集来判断一棵树。。注意空树也是树,死人也是人。POJ-1611裸地水并查集POJ-1703种类并查集PO转载 2013-04-24 11:36:24 · 1840 阅读 · 0 评论 -
poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
题目链接 逆序的概念大家都知道,一个数到逆序数就是该数左边大于它到数的个数。 很多没学过数据结构的人一上来肯定就是一个个数了,看看数据量500k,显然这种暴力的方法是行不通的。 我们换种想法,可以在输入过程中对每个数的逆序数求解,建一个vis数组(初始化为0),只要输入一个数,在它的位置标记为1,然后计算出它的左边一共有多少数被标记了就可以知道多少个数比他原创 2013-04-25 16:09:59 · 1962 阅读 · 0 评论 -
hdoj 4288coder & cf 85d Sum of Medians
题目链接 这两个题目是一样的,大概题意是有3个操作 add x, 在集合中加入x, del x 是删除x, sum 是求出由小到大排序后所有下标mod5等于3的数的和。 这个在hdoj上面,这个题给的时间比较多10s,我用了stl 里的vector和 lower_bound, lower_bound 它的作用是返回不小于x的第一个数的位置,这样我们每次插入后就能保证他有序。 最终耗原创 2013-05-18 20:38:08 · 1734 阅读 · 0 评论 -
light oj 1258 - Making Huge Palindromes(KMP)
题目链接题意: 给你一个字符串,在字符串尾部加上一些字符,使这个字符串变成一个回文串(正反读都一样的字符串),求该回文串的最小长度。思路: 在light oj里这个题目是属于KMP分类的,但乍看好像不是kmp,因为只有一个字符串。要想的到一个回文串,把该字符串翻转接到原串后面必然是一个回文串,但并不一定是最短的。我们必须考虑怎么把两个串尽量融合在一起,这就要看翻转串原创 2013-05-13 20:10:48 · 1843 阅读 · 0 评论 -
codeforces 272C. Dima and Staircase(线段树)
题目链接 题目很长,看加猜加谷歌翻译才看懂了题目。每级台阶的宽都是1,但高不同,并且告诉你了,然后给你m个箱子,长和宽都告诉你,把箱子靠左放,求箱子的底部有多高。 因为都是放在最左边的,所以只要和最左边的高度比较,这样就不用更新线段树了。代码://cf 272 C//2013-05-14-20.26#include using namespace std;原创 2013-05-14 20:28:59 · 2036 阅读 · 0 评论 -
POJ 3264 RMQ
题意就是让你求区间最大和最小值的差值。这题可以用线段树,也可以用Tarjan 的Sparse Table算法(参考刘汝佳训练指南197),这里我用了ST算法,还有要说明的是题目描述的数据范围是不准确的如果你数组开比50000大一点点的话是会RE的。代码://poj 3263 RMQ//2013-07-30-21.39#include #include #include usi原创 2013-07-30 21:45:57 · 1670 阅读 · 0 评论 -
第K小数 uva 10041 - Vito's Family poj 2388 Who's in the Middle
题目链接 很容易理解题目的意思,就是求某个点到其他点的距离之和,而且要让这个和最小,很明显是求中位数了。 关于求中位数,一般的方法是我们先将整个数组进行排序,然后直接取出中位数,采用不同的排序方法可能有不同的时间复杂度,一般我们使用快排,时间复杂度为O(nlogn),有没有更快的方法? 答案是肯定的。 这里有一种时间复杂度为O(n)的算法,下面是此题的解题代码。原创 2013-04-03 16:25:32 · 2352 阅读 · 0 评论