数据结构与算法
MiniSheep_CS
编程者如上帝,可以创造万物。
展开
-
二叉堆的实现和详解(优先队列的基础)
二叉堆的基本内容:由于堆是一颗被完全填满的二叉树,所以最后一层是从左到右一次填入的,所以可以不必要链表表示(不连续),可以用数组表示比较节省开销(vector)。在堆操作中,两个比较重要和新的内容是上滤和下滤,个人总结了一下,插入新的结点的时候用上滤,删除最小结点的时候用下滤。还有一个值得注意的概念,它叫空穴,空穴顾名思义是空的,比如删除了根结点的元素,那么现在根结点即为空穴。好接下来我们原创 2015-01-11 22:29:54 · 746 阅读 · 0 评论 -
图论之无权最短路径
无权最短路径顾名思义是边没有权值,所以我们可以把所有的边都赋值为1,求最短路径可以采用广度优先搜索(BFS),该方法按层处理顶点,距开始点最近的那些顶点首先被求值,而最远的那些顶点最后被求值。这很像对树的层序遍历。首先先把不通的路径置为无穷大(我这里置为-1),可以通的路置为1,然后运用广度优先搜索(使用的是队列实现),先取一个点作为始发点,这里取v3,然后把v3加入队列,然后一次寻找可以通的路,原创 2015-02-03 12:22:30 · 674 阅读 · 0 评论 -
bellman-ford算法(判断是否存在负环)
Bellman-ford算法的一个重要应用是判负环。在迭代n-1次后如果还可以进行松弛操作,说明一定存在负环。如果采用队列实现,那么当某个结点入队了n次时可以判断出存在负环,代码如下:#include#include#include#include#include#includeusing namespace std;const int maxn = 1001;struct E原创 2015-02-04 19:57:41 · 4566 阅读 · 0 评论 -
网络流之最大流(Edmonds-Karp算法和Dinic算法)
Ford-Fulkerson算法的基本思路:Ford-Fulkerson算法是求解最大流的基本算法,主要思想是,每次在残量网络中寻找一条从源到汇的路径(称为增广路径),并沿着这条路径增加流量,该算法的改进为Edmonds-Karp算法,与Ford-Fulkerson算法基本无异。Edmonds-karp算法的复杂度为O(|V|*|E|²),在稀疏图(边少点多)中可以得到不错的运行效率。原创 2015-02-07 14:47:10 · 1320 阅读 · 0 评论 -
Kruskal最小生成树算法
#include#include#includeusing namespace std;const int maxn = 1001;int fa[maxn];int N,M;struct edge{ int x,y,w; edge(int x = 0,int y = 0,int w = 0):x(x),y(y),w(w) {}}e[maxn];bool cmp(e原创 2015-02-09 20:52:14 · 506 阅读 · 0 评论 -
求解无向图的割点和桥
无向图的割点和桥割点和桥的概念:对于无向图G,如果删除某个点u后,连通分量数目增加(本来为一个连通集,现在变为多个),称u为图的割点。对于连通图,割点就是删除之后不再连通的点。当然了,桥也同理,只不过桥是边,也称为割边,如果删掉(u,v)之后连通分量数目增加,那么我们称(u,v)这条边为桥(割边)。求割点和桥的方法:①很容易想到的,暴力每个结点,然后用DFS判断连通分量是否增加,时原创 2015-02-11 20:19:45 · 827 阅读 · 0 评论 -
一步一步理解线段树
一 概述线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(logn)。线段树的每个节点表示一个区间,子节点则分别表示父节点的左右半区间,例如父亲的区间是[a,b],那么(c=(a+b)/2)左儿子的区间是[a,c],右儿子的区间是[c+1,b]。转载 2015-02-15 19:21:10 · 362 阅读 · 0 评论 -
STL之priority_queue的使用
priority_queue说明:优先队列的实现就不说了,运用的是堆的知识,前几篇博客已经有提到。现在讲讲如何在比赛的时候直接用STL里面的队列头文件中的priority_queue来帮我们解题。下文有两种使用方法,一种是运用#include中的greater和less来帮我们实现数据的排序。还有一种是自定义,也就是自己写排序方法让priority_queue来根据我们排序方法来排序。代码原创 2015-02-13 18:02:12 · 512 阅读 · 0 评论 -
hdu1166 敌兵布阵(线段树入门题)
#includeusing namespace std;const int maxn = 50001;struct tree{ int left,right; int sum;}node;tree t[maxn * 3]; //结点数int a[maxn]; //元素的值void build(int num,int left,int right) //num表示序号原创 2015-02-15 17:31:35 · 493 阅读 · 0 评论 -
左式堆的实现与详解
左式堆的性质:像二叉堆那样既有结构性质,又有堆序性质。事实上,和所有使用的堆一样,左式堆具有相同的堆序性质,该性质我们已经看到过。不仅如此,左式堆也是二叉树,左式堆和二叉堆唯一的区别是:左式堆不是理想平衡的,而且事实上是趋于非常不平衡的。零路径长:(null path length)假设有个结点x,npl(x)定义为x到一个不具有两个儿子的结点的最短路径的长,因此,具有0个或1个儿子的原创 2015-01-15 12:22:04 · 916 阅读 · 0 评论 -
图论之拓扑排序
引例:首先先举一个拓扑排序比较贴近实际的例子吧。比如我想修操作系统这门课,假设学校要求必须先修数据结构和C语言,我必须满足修过数据结构和c语言才可以修操作系统这门课。但是有一个很奇怪的问题就是如果反过来如果要求学C语言和数据结构之前要学操作系统,那么就会出现问题,所以拓扑排序的充要条件就是不能出现回路,即出发点和终点都是自身的情况。实现:寻找一个尚未分配拓扑编号的入度为0的顶点,如原创 2015-01-31 21:46:51 · 465 阅读 · 0 评论 -
HashTable(不使用链表的散列表)
分离链接散列算法的缺点是使用一些链表,由于给新单元分配地址需要时间,因此这就导致算法的速度有些缓慢,同时算法实际上还需要第二种数据结构的实现。下面就用探测散列表来实现哈希表。1.线性探测在线性探测中,函数f是i的线性函数,一般情况下f(i) = i,这相当于逐个探测每个单元(使用回绕)来查找出空单元。2.平方探测平方探测是消除线性探测中一次聚集问题的冲突解决方法。平方探测就是冲突函原创 2015-01-04 19:54:42 · 686 阅读 · 0 评论 -
HashTable(哈希表分离链接法)
哈希表的分离链接法其实就是个vector容器 + 链表来实现的,其本质就是如果数值(mod)相等的话就插入到vector的同一格,将相等的两个值依次存放在链表中,如果空间很小的话建议不要采用此方法,因为此方法的链表为双向链表,下面为分离链接法的代码:#include#include#include#include#includeusing namespace std;template原创 2015-01-04 09:08:39 · 735 阅读 · 0 评论 -
二叉树的遍历
#include#include#includeusing namespace std;//二叉树结点typedef struct BiTNode{ //数据 char data; //左右孩子指针 struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//按先序序列创建二叉树int CreateBiTree(BiTree &T原创 2014-12-22 18:37:52 · 505 阅读 · 0 评论 -
将中缀表达式转换成后缀表达式
#include#include#include#include#includeusing namespace std;void inToPostfix(){ stack s; char token; cin>>token; while(token != '=') { if(token >= 'a' && token <= '原创 2014-12-18 14:14:41 · 479 阅读 · 0 评论 -
vector容器内部实现机理(源代码和测试代码)
//Vector.h,个人实现的头文件,源文件引用时用#include "Vector"#ifndef VECTOR_INCLUDED#define VECTOR_INCLUDEDtemplateclass Vector{public: explicit Vector(int initSize = 0):theSize(initSize),theCapacity(initSiz原创 2014-12-16 15:07:09 · 1164 阅读 · 0 评论 -
数据结构之查找二叉树--BST
#include using namespace std;templateclass BinarySearchTree{public: BinarySearchTree(); BinarySearchTree(const BinarySearchTree& rhs); //copy constructor ~BinarySearchTree(); //destru原创 2014-12-24 12:44:36 · 483 阅读 · 0 评论 -
STL list容器实现集合的交和并
集合的交:#include#include#includeusing namespace std;templatelist intersection(const list &L1,const list &L2){ list intersect; typename list::const_iterator iterL1 = L1.begin(); typename原创 2014-12-21 20:16:32 · 505 阅读 · 0 评论 -
计算后缀表达式的值
#include#include#include#include#includeusing namespace std;double evalPostFix(){ stack s; string token; double a,b,result; cin>>token; while(token[0] != '=') {原创 2014-12-18 13:11:21 · 704 阅读 · 0 评论 -
无根树转有根树代码
#include#include#includeusing namespace std;const int maxn= 10005;int n,p[maxn];vector G[maxn];void dfs(int u,int fa) //递归转化为以u为根的子树,u的父亲为fa { int d = G[u].size(); for(int i=0;i<d;i++) //循原创 2015-09-21 21:24:03 · 522 阅读 · 0 评论