
数据结构
文章平均质量分 91
_Tham
If you sleep now , you will hava a dream. But if you study now , you will achieve your dream.
展开
-
点分治与点分树学习
关于树链分治的一些东西《分治算法在树的路径问题中的应用》例题给出一棵n个结点的有根树,每个结点有颜色。有若干询问,询问有多少种颜色,在v为根的子树中至少有k个结点属于该颜色。算法1莫队(好像都是这么叫的)离线方法。时间复杂度O(nn)O(n \sqrt n)O(nn)。算法2这个算法基于一个简单的结论:每个询问的答案不会超过n/kn/kn/k。这样,我们确定一个阀值x=n\sq...原创 2020-03-28 09:59:51 · 876 阅读 · 0 评论 -
CQD(陈丹琦)分治 & 整体二分——专题小结
整体二分和CDQ分治有一些问题很多时间都坑在斜率和凸壳上了么……感觉斜率和凸壳各种搞不懂……整体二分 整体二分的资料好像不是很多,我在网上找到了一篇不错的资料:http://www.cnblogs.com/zig-zag/archive/2013/04/18/3027707.html整体二分是个很神的东西,它可以把许多复杂的数据结构题化简。它的精髓在于巧妙地利用了原创 2015-05-06 17:47:21 · 11297 阅读 · 0 评论 -
AC自动机算法小结
AC自动机,可惜不能自动AC转载:飘过的小牛 OIer55242简介Aho-Corasick automation该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有字典树Trie和KMP模式匹配算法的基础知识。KMP算法是单模式转载 2015-04-27 20:55:30 · 1388 阅读 · 0 评论 -
树形动态规划(树形DP)入门问题—初探 & 训练
树形DP入门poj 2342 Anniversary party 先来个题入门一下~题意:某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚会的总活跃指数最大。解题思路:任何一个点的取舍可以看作一种决策,那么状态就是在某个点取的时原创 2015-04-29 22:40:03 · 32257 阅读 · 10 评论 -
C++ 线段树—模板&总结
在信息学竞赛中,经常遇到这样一类问题:这类问题通常可以建模成数轴上的问题或是数列的问题,具体的操作一般是每次对数轴上的一个区间或是数列中的连续若干个数进行一种相同的处理。常规的做法一般依托于线性表这种数据结构,导致了处理只能针对各个元素逐个进行,因此算法的效率较低。 线段树是一种能够有效处理区间操作的高级数据结构,利用这种数据结构,我们能够设计出针对上述问题更加高效的算法。 线原创 2015-04-29 23:15:18 · 8875 阅读 · 0 评论 -
树形动态规划(树状DP)小结
树状动态规划定义之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系。利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的程序。而深搜的特点,就是“不撞南墙不回头”。这一点在之后的文章中会详细的介绍。 首先是扫盲,介绍几条名词的专业解释以显示我的高端(大部分人可以略过,因为学习到树规的人一下应该都懂……原创 2015-04-29 23:10:03 · 33193 阅读 · 6 评论 -
并查集 (Union-Find Sets)及其应用
并查集:(union-find sets)是一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多。一般采取树形结构来存储并查集,并利用一个rank数组来存储集合的深度下界,在查找操作时进行路径压缩使后续的查找操作加速。这样优化实现的并查集,空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N次合并M查找的时间复杂度为O(M Alpha(N)),这里Alpha是Ackerman函数的某个反函数,在很大的范围内(人类目前观测到的宇宙范围估算有10的8原创 2015-04-14 21:30:53 · 2198 阅读 · 0 评论 -
【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
转载请注明出处:http://blog.youkuaiyun.com/ns_code/article/details/19617187图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS),因此不再对图的基本概念做过多的介绍,但是要先大致了解下图的几种常见的存储结构。 邻接矩阵 邻接矩阵既可以用来存储无向图,也可以用来存储有向图。该结构转载 2015-04-10 16:32:58 · 1464 阅读 · 0 评论 -
图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)
#include #include #include #include #include #include using namespace std; typedef struct MGraph{ string vexs[10];//顶点向量 int arcs[10][10];//邻接矩阵 int vexnum, ar原创 2015-04-10 15:35:31 · 1278 阅读 · 0 评论 -
图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
#include #include #include using namespace std; #define MAXN 100 struct ArcNode { int adjVertex; //边到的顶点 ArcNode *next; }; struct VNode { string d原创 2014-12-02 16:04:05 · 1165 阅读 · 0 评论 -
【并查集】判断是否为树
【问题描述】树是一种大家都不陌生的数据结构,它有可能是一颗空树或是一些满足要求的节点连接而成的有向边的集合。一棵树只有一个根节点,根节点没有指向它的边。除了根节点的每一个节点都只有一条边指向它。出现环的图都不是树。对一些节点连接而成的有向边的集合进行判定,判定每一组的输入数据构成的图是否是一棵树。【输入】每输入一对都为0的数时,表示一组数据输入完毕。每条边由一对正整数表原创 2015-04-10 16:28:25 · 1768 阅读 · 0 评论 -
二叉树高度,栈实现二叉树的先序,中序,后序遍历的非递归遍历,二叉树层次遍历
求解二叉树的高度树是递归定义的,所以用递归算法去求一棵二叉树的高度很方便。#include #include using namespace std; struct Node { char data; Node *lchild; Node *rchild; }; void High(Node *T, int &h)原创 2015-03-29 21:29:33 · 3067 阅读 · 0 评论 -
最小生成树之prim算法
最小生成树之prim算法 边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。 最小生成树(MST):权值最小的生成树。 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路。可以把边上的权值解释为线路的造价。则最小生成树表示使其造价最小的生成树。 构造网的最小生成树必须解决下面两个转载 2014-09-02 18:04:57 · 1219 阅读 · 0 评论 -
AC自动机相关Fail树和Trie图相关基础知识
fail树定义把所有fail指针逆向,这样就得到了一棵树(因为每个节点的出度都为1,所以逆向后每个节点入度为1,所以得到的是一棵树)还账…有了这个东西,我们可以做很多事…对于AC自动机的构造前面的文章已经讲了,而在查询的时候,有一点感觉没有说清楚: 对于x串在y串中出现,必然是在y串某个前缀的后缀与x串相同fail指针指向与该节点表示串后缀相等转载 2015-04-27 21:01:59 · 5310 阅读 · 1 评论 -
数学之美系列六——图论和网络爬虫
数学之美系列六——图论和网络爬虫数学之美系列[离散数学是当代数学的一个重要分支,也是计算机科学的数学基础。它包括数理逻辑、集合论、图论和近世代数四个分支。数理逻辑基于布尔运算,我们已经介绍过了。这里我们介绍图论和互联网自动下载工具网络爬虫 (Web Crawlers) 之间的关系。顺便提一句,我们用 Google Trends 来搜索一下"离散数学"这个词,可以发现不少有趣的现象。转载 2015-04-27 22:44:49 · 1454 阅读 · 0 评论 -
bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3376题目大意:编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱.有P(1≤P≤100000)个指令.指令有两种:1.移动(M):将包含X的立方柱移动到包含Y的立方柱上.2.统计(C):统计名含X的立方柱中,在X下方的方块数目.题解:原创 2016-11-04 11:43:22 · 1058 阅读 · 1 评论 -
HiHocoder 1036 : Trie图 AC自动机
Trie图 先看一个问题:给一个很长很长的母串 长度为n,然后给m个小的模式串。求这m个模式串里边有多少个是母串的字串。最先想到的是暴力O(n*m*len(m)) len(m)表示这m个模式串的平均长度。。。显然时间复杂度会很高。。。再改进一些,用kmp让每一模式串与母串进行匹配呢?时间复杂度为O((n + len(m))*m),还算可以。可是还有没有更快的原创 2016-10-08 21:29:16 · 962 阅读 · 0 评论 -
约瑟夫环问题
约瑟夫环问题(基本)n个人围成圈,依次编号为1,2,..,n,现在从1号开始依次报数,当报到m时,报m的人退出,下一个人重新从1报起,循环下去,问最后剩下那个人的编号是多少?递归法参见百度百科:Josephus(约瑟夫)问题的数学方法递推式: 将这些人的编号用对总人数取模所得余数代替(即原编号减一),其中 Fn 表示n个人的原创 2015-12-06 13:46:08 · 2641 阅读 · 1 评论 -
C++ STL中哈希表Map 与 hash_map 介绍
0 为什么需要hash_map用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改:岳不群-华山派掌门人,人称君子剑张三丰-武当掌门人,太极拳创始人东方不败-第一高手,葵花宝典...这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"原创 2016-04-06 15:00:02 · 7985 阅读 · 2 评论 -
树状数组
树状数组经常用来求一段区间的和,适用于该区间上的值是在不断变化的情景(不然就前缀和处理下就行了),常规数组的修改是O(1),区间查询是O(n),而树状数组的修改和查询都是O(lgn). 尽管线段树也能处理这种情况,并且功能要强大的多,但是树状数组编码上简单太多~感谢评论区的补充:树状数组往高维扩展时非常方便(加个循环的事情),而线段树则写起来非常麻烦树状数组需要一个辅助数组C,假设输入原创 2016-04-05 11:52:49 · 702 阅读 · 0 评论 -
堆栈—冲刺十三模拟赛 外星密码
P1967 - 【NOIP2010冲刺十三模拟赛】外星密码Description有了防护伞,并不能完全避免2012的灾难。地球防卫小队决定去求助外星种族的帮助。经过很长时间的努力,小队终于收到了外星生命的回信。但是外星人发过来的却是一串密码。只有解开密码,才能知道外星人给的准确回复。 解开密码的第一道工序就是解压缩密码,外星人对于连续的若干个相同的子串“x”会压缩为原创 2015-10-12 19:44:41 · 1171 阅读 · 0 评论 -
邻接矩阵实现图的存储,DFS,BFS遍历
#include#define GRAPHMAX 10#define FALSE 0#define TRUE 1#define Error printf#define QueueSize 30 typedef struct{ char vexs[GRAPHMAX]; int edges[GRAPHMAX][GRAPHMAX]; int n,e;}Mgrap原创 2014-09-02 17:14:45 · 6585 阅读 · 0 评论 -
二叉查找树(二叉排序树)的详细实现,以及随机平衡二叉查找树Treap的分析与应用
这是一篇两年前写的东西,自我感觉还是相当不错的Treap教程。正好期末信息科学技术概论课要求交一个论文,就把这个东西修改了一下交了,顺便也发到这里吧。随机平衡二叉查找树Treap的分析与应用原创 2014-08-17 13:07:00 · 1311 阅读 · 0 评论 -
哈希表(散列表),Hash表漫谈
1、序 该篇分别讲了散列表的引出、散列函数的设计、处理冲突的方法。并给出一段简单的示例代码。2、散列表的引出 给定一个关键字集合U={0,1......m-1},总共有不大于m个元素。如果m不是很大,我们可以定义一个数组T[0...(m-1)],把U映射到数组T上,每个位置对应U中的一个关键字,若U中没有关键字为k的元素,则T[k]=NULL。我们称原创 2015-04-28 11:20:17 · 1493 阅读 · 0 评论 -
随机系列生成算法(随机数生成)
1、问题描述 给定一个正整数n,需要输出一个长度为n的数组,数组元素是随机数,范围为0 – n-1,且元素不能重复。比如 n = 3 时,需要获取一个长度为3的数组,元素范围为0-2。2、准备 首先,让我们先构造如下函数:[cpp] view plaincopy//随机数生成函数,生成[a,b]原创 2015-04-28 11:16:06 · 5932 阅读 · 0 评论 -
哈希表(散列表)—Hash表解决地址冲突 C语言实现
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。具体的介绍网上有很详细的描述,如闲聊哈希表 ,这里就不再累述了;哈希表在像Java、C#等语言中是与生俱来的。可是在C的世界中,似乎只有自己动手,丰衣足食;在网上google了一把,大致有几个版本,我会一一来分析原创 2014-10-17 14:13:43 · 5889 阅读 · 0 评论 -
STL之heap与优先级队列Priority Queue详解
一、heap heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制。而这个实现机制中的max-heap实际上 是以一个vector表现的完全二叉树(complete binary tree)。STL在中实现了对 存储在vector/deque 中的原创 2015-03-24 10:56:49 · 3284 阅读 · 0 评论 -
最小生成树的邻接矩阵实现
求上面这个图的最小生成树原创 2014-09-02 17:50:23 · 7034 阅读 · 0 评论 -
C++ 队列(queue)堆栈(stack)实现基础
在C++中只要#include即可使用队列类,其中在面试或笔试中常用的成员函数如下(按照最常用到不常用的顺序)1. push2. pop3. size4. empty5. front6. back接下来逐一举例说明:1. push队列中由于是先进先出,push即在队尾插入一个元素,如:1 queuestring> q;原创 2014-11-16 20:22:16 · 2982 阅读 · 0 评论 -
Prim算法和Kruskal算法
Prim算法和Kruskal算法都能从连通图找出最小生成树。区别在于Prim算法是挨个找,而Kruskal是先排序再找。 一、Prim算法: Prim算法实现的是找出一个有权重连通图中的最小生成树,即:具有最小权重且连接到所有结点的树。(强调的是树,树是没有回路的)。 Prim算法是这样来做的: 首先以一个结点作转载 2014-09-02 18:15:42 · 999 阅读 · 0 评论 -
最小生成树 Prim(普里姆)算法和Kruskal(克鲁斯特尔)算法
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或Prim(普里姆)算法求出原创 2014-11-15 21:46:48 · 2146 阅读 · 0 评论 -
连续最大和,数字类区间问题
例题:1.N个数排成一排,你可以任意选择连续的若干个数,算出它们的和。问该如何选择才能使得和的绝对值最小。如:N=8时,8个数如下:-20 90 -30 -20 80 -70 -60 125如果我们选择1到4这4个数,和为20,还可以选择6到8这3个数,和为-5,|-5|=5,该方案获得的和的绝对值最小。输入格式:原创 2014-10-09 17:00:05 · 1846 阅读 · 0 评论 -
哈希排序
第一部分:Top K 算法详解问题描述百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1转载 2014-10-06 22:29:20 · 8628 阅读 · 0 评论 -
二叉树的建立及递归遍历
#include#include#include //定义节点 typedef struct BiNode{ char data; struct BiNode *lch; struct BiNode *rch;}BiNode,*BiTree; //先序拓展序列建立二叉树 void Create(BiTree &T){原创 2014-09-02 17:08:17 · 757 阅读 · 0 评论 -
十大编程算法
算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比 较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构 上很有效率地被实现出来。快速排序使用分治法(Divide and conquer转载 2014-09-02 16:32:48 · 680 阅读 · 0 评论 -
邻接表实现图的储存,遍历
邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表),第i个单链表中的结点包含顶点Vi的所有邻接顶点。又称链接表。1.在有向图的邻接表中不易找到指向该顶点的弧。2.在有向图的邻接表中,对每个顶点,链接的是以该顶点为弧尾的邻接点。原创 2014-09-02 17:17:23 · 2078 阅读 · 0 评论 -
treap(树堆)
一棵treap是一棵修改了结点顺序的二叉查找树,如图,显示一个例子,通常树内的每个结点x都有一个关键字值key[x],另外,还要为结点分配priority[x],它是一个独立选取的随机数。假设所有的优先级是不同的,所有的关键字也是不同的。treap的结点排列成让关键字遵循二叉查找树性质,并且优先级遵循最小堆顺序性质:1.如果v是u的左孩子,则key[v] 2.如果v是u的右孩子,则ke原创 2014-08-15 21:14:54 · 691 阅读 · 0 评论 -
二叉树的宽度与高度
分冶策略. 1.二叉树的高度 2.二叉树的宽度 3.比较两个二叉树是否相等数据结构的定义 先定义一个简单的二叉树,由于只是演示,所以定义得比较简单. #include #define MAX(x,y) ((x)>(y)?(x):(y)) //define a binary search tree typede转载 2014-07-20 16:55:38 · 1110 阅读 · 0 评论 -
二叉树的递归定义及存储
定义最多有两棵子树的有序树,称为二叉树。二叉树是一种特殊的树。递归定义:二叉树是n(n>=0)个有限结点构成的集合。N=0称为空二叉树;n>0的二叉树由一个根结点和两互不相交的,分别称为左子树和右子树的二叉树构成。二叉树中任何结点的第1个子树称为其左子树,左子树的根称为该结点的左孩子;二叉树中任何结点的第2个子树称为其右子树,左子树的根称为该结点的右孩子。如下图是一原创 2014-07-20 16:12:06 · 1764 阅读 · 0 评论 -
Hash表及hash算法的分析
Hash表中的一些原理/概念,及根据这些原理/概念:一. Hash表概念二. Hash构造函数的方法,及适用范围三. Hash处理冲突方法,各自特征四. Hash查找过程五. 实现一个使用Hash存数据的场景-------Hash查找算法,插入算法六. JDK中HashMap的实转载 2014-10-17 12:57:27 · 1077 阅读 · 0 评论