- 博客(13)
- 资源 (1)
- 收藏
- 关注
原创 并查集
并查集是用来管理元素分组情况的数据结构,其具有以下性质:1.高效查询元素a和元素b是否属于同一组2.高效合并元素a和元素b所在分组3.无法进行分割操作并查集的最典型应用莫过于判断图的动态连通性,例如判断网络中两台电脑是否连接等,因此我需要对问题进行建模。就动态连通性这个场景而言,我们需要解决的问题可能是:给出两个节点,判断它们是否连通,如果连通,不需
2017-04-28 11:08:30 186
原创 折半枚举
折半枚举不是一般的双向搜索,当问题的规模较大,无法枚举所有元素的组合,但能够枚举一半元素的组合,此时将问题拆成两半后分别枚举,再合并它们的结果这一方法往往非常有效。POJ 2785:给定各有n个整数的四个数列A,B,C,D。从每个数列中各取一个数,使四个数的和为0.当一个数列中有多个相同数字时,把它们作为不同的数字看待。求出这样的组合的个数。void solve(){
2017-04-27 15:03:53 1088 1
原创 树状数组
平常我们经常会遇到一些对数组进行维护查询的操作,比较常见的如:修改某点的值,求某个区间的和。当数据规模不大的时候可以使用朴素方法,但当规模增大后是划不来的。而这两个操作正是树状数组的强项。树状数组的结构如图所示:从图中可以看出:c[1] = a[1]c[2] = a[1] + a[2]c[3] = a[3]c[4] = a[1] + a[2] + a[3] +
2017-04-27 09:27:20 191
原创 单调栈以及单调队列
栈就是后进先出的数据结构,而所谓单调栈就是栈内元素单调递增或者单调递减的栈。单调栈具有以下性质:1.单调栈内元素具有单调性2.元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除3.使用单调栈可以找到元素向左遍历的第一个比他小的元素,也可以找到元素向左遍历第一个比他大的元素单调栈的最重要的就是第三个性质,我们来论证下:1.当单调栈中的元素是单调递增的时候,可以
2017-04-25 16:19:54 436
原创 Merge Intervals
Given a collection of intervals, merge all overlapping intervals.For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6],[8,10],[15,18].这道题的思路其实也很直接,就是先将intervals按start值进行排序,然后从头开始进行
2017-04-21 16:25:45 144
原创 Binary Tree Inorder Traversal
Given a binary tree, return the inorder traversal of its nodes' values.For example:Given binary tree [1,null,2,3], 1 \ 2 / 3return [1,3,2].Note: Recursive solu
2017-04-21 15:46:22 148
原创 经典数据结构
红黑树 B树 B+树 R树 2-3-4树 K-d 树 树状数组 跳跃表 线段树 伸展树单调队列 单调栈 一致哈希表 并查集逆序对 环形缓存 双端队列字典树 后缀树 后缀 数组 Trie树 AC自动机 折半枚举 分桶法和平方分割堆 二项堆 斐波那契堆 Treap树堆 快速排序
2017-04-20 10:13:09 276
原创 服务定位器
服务定位器提供服务的全局接入点,避免使用者和实现服务的具体类耦合,解耦需要服务的代码和服务由谁提供以及服务在哪里。服务类定义了一堆操作的抽象接口,具体的服务提供者实现这个接口,分离的服务定位器提供了通过查询获取服务的方法,同时隐藏了服务提供者的具体细节和定位它的过程。使用服务定位器的核心难点就是它将依赖-在两块代码之间的一点耦合-推迟到运行时再连接,这具有更大的灵活度,但是代价是更难在
2017-04-19 15:07:40 328
原创 事件队列
事件队列解耦发出消息或事件的时间和处理它的时间。在队列中按先入先出的顺序存储一系列通知或请求,发送通知时,将请求放入队列并返回,处理请求的系统之后稍晚从队列中获取请求并处理,解耦发送者和接收者。如果你只是想解耦接收者和发送者,可以使用观察者模式和命令模式,但解耦某些需要及时处理的东西时需要使用队列。队列将控制权从发送者那里拿走,接收者可以延迟处理,合并或忽视请求,当发送者需要回复时,队
2017-04-19 13:49:44 844
原创 组件模式
当代码耦合时,将不同系统捆绑成一个代码球,此时就可以使用该模式从而允许单一的实体跨越多个领域而不会导致这些领域彼此耦合,为了保持领域之间相互分离,将每部分代码放入各自的组件类中。使用场景:1.有一个涉及了多个领域的类,而你想要保持这些领域互相隔离2.一个类正在变大而且越来越难以使用3.想要能定义一系列分享不同能力的类,但是使用继承无法让你精确选取要重用的部分使用
2017-04-19 10:51:37 859
原创 子类沙盒
子类沙盒的目的:使用一个基类提供的操作集合进而在子类中定义行为。一个基类定义了一个抽象的沙盒方法和一些提供的操作。通过设置他们为保护状态来保证它们仅供子类使用,每个继承的沙盒子类针对父类提供的操作来实现沙盒函数。将所有的耦合都聚集到基类,子类就明显地与其他类更加独立。当你发现基类有大量子类的时候,这意味着数据驱动的方法可能更适合。找到一种定义数据的行为的方法,而不是用大量的代码来定义。
2017-04-18 16:00:38 324
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人