线段树概述

线段树,类似区间树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(logn)。

线段树的每个节点表示一个区间,子节点则分别表示父节点的左右半区间,例如父亲的区间是[a,b],那么(c=(a+b)/2)左儿子的区间是[a,c],右儿子的区间是[c+1,b]。

继续阅读→

阅读全文

学完最小生成树就来学习下它的相关算法吧。。。

在最小生成树的实际应用中我们常常会遇到这一类问题,给你一张无向带权连通图和两个节点u,v让你求u,v之间的一条路径使得u->v路径上最大的边权最小值。这一类问题我们称之为最小瓶颈路问题。

继续阅读→

阅读全文

无聊了再坑一坑图论吧。。。啥都搞不好。。。

给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树。。。

有两种著名的算法。。。prim,kruskal。。。

prim的效率取决于优先队列的实现与图的存储方式,这里记顶点数v,边数e 邻接矩阵:O(v2)、邻接表:O(elog2v),若用斐波那契堆作为优先队列则效率为O(e+vlog2v)

kruskal的效率取决于并查集的实现,若用按秩合并与路径压缩效率为O(elog2e)

继续阅读→

阅读全文