自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

白色咖啡

White Java

  • 博客(73)
  • 收藏
  • 关注

原创 浅谈Java集合框架

集合框架最大的作用就是维护一组类型相同的对象。只是不同的类有不同的行为和性能。通常关注以下这些行为:能否存放重复的元素遍历的顺序是怎样的是否支持多线程下面首先介绍集合的常用,随后根据每种行为分别进行讨论。常用操作常用的操作一般就是增加删除查询。常用的增加操作有add、addAll,常用的删除操作有remove、removeAll,常用的读取操作有contains、get

2014-06-27 20:20:17 788

原创 算法9-6:最大流的应用

最大流算法在现实生活中有着广泛的应用,从数据挖掘到图像处理,都有应用。现实生活中很多事物看起来是不相干的,而实际上只要通过数学建模,其实很多问题本质上都是一样的。这里举的一些例子很多都是没办法第一眼就看出来,首先要理解最大流算法的模型,其次就是将现实生活中的问题转换成最大流问题从而进行求解。二分图匹配问题大学即将毕业了,很多童鞋要去找

2014-06-27 20:08:21 7635

原创 算法9-5:最大流算法的Java代码

残留网络在介绍最大流算法之前先介绍一下什么是残留网络。残余网络的概念有点类似于集合中的补集概念。下图是残余网络的例子。上面的网络是原始网络,下面的网络是计算出的残留网络。残留网络的作用就是用来描述这个网络中还剩下多少可以利用的流量。流量网络最大流算法比以前介绍的算法都要复杂。网络中的

2014-06-27 20:06:34 3217

原创 算法9-4:最大流算法复杂度分析

前面一节介绍了Ford-Fulkerson算法。那么这个算法是否一定能够在有限步骤内结束?要多少步骤呢?这个问题的答案是,该算法确实能够在有限步骤之内结束,但是至于需要多少步骤,就要仔细分析。为了分析问题,需要假定图中所有边的容量都是整数。但是有个严重的问题,比如下图中,如果使用Ford-Fulkerson算法,需要迭代200次才能结束。

2014-06-27 20:04:28 6225

原创 算法9-3:最大流和最小切割的理论

本章节介绍最大流问题和最小切割问题的关系。其实这两个问题是等价的。现在把一个网络分成A和B两个部分,我们定义A到B的净流量交叉(Net flow across)就是从A到B的最大流量减去从B到A的最大流量。接下来介绍流量值定理(Flow-value lemma)。令f为网络中任何一个流,令(A,B)为网络的任何一种切割方法,那么(A,B)的净流量交叉就等同于

2014-06-26 21:11:26 2269

原创 算法9-2:最大流Ford-Fulkerson算法

本节介绍最大流算法的基本思想。首先将整个网络的最大容量都设为0。然后增加第一条边的流量,达到最大流量。增加第二条边的流量,达到最大流量。增加第三条边的流量,达到最大流量。这里需要注意的是,图中有一条反向的边(称之为后向弧)。后向弧的作用就是说,可以将后向弧中的

2014-06-26 21:10:21 1253

原创 算法9-1:最大流和最小切割问题

最小切割问题首先介绍什么是切割。切割就是将一张图中的顶点分成两部分A和B。接下来介绍一下什么是容量。容量是A区到B区所有的边权重之和。最小切割就是求一张图中使得容量最小的切割方式。最小切割的应用最小切割在国家的拆分时会用到。著名的苏联解体事件就是通过计算最小切割来实现国家的拆分。在建模的时候将城市作为图

2014-06-26 21:08:15 2145

原创 算法8-11:最短路径算法之负权

负权指的是一张图中包含一条权重小于0的边。负环指的是一张图中存在权重只和为负数的环。如果一张图中存在负环,那么这张图是没有最短路径的。那么,假设图中不存在负环,但是有负权,那么最短路径如何求解呢?答案就是使用Bellman-Ford算法,该算法的性能一般。基本思想Bellman-Ford算法的基本思想就是对图中所有的边都进行V次“放松”操作。

2014-06-26 21:06:24 3351

原创 算法8-10:最短路径算法之拓扑排序

该算法的基本思想就是按照拓扑排序的顺序依次将每个顶点加入到最短路径树中,每次加入时将该顶点延伸出的所有顶点进行“放松”操作。这种算法的复杂度是E+V。代码这种算法的代码比Dijkstra还要简单,代码如下:public class TopologySP extends SP { public TopologySP(EdgeWeightedDigr

2014-06-26 21:04:56 4007

原创 算法8-9:Dijkstra算法

Dijkstra算法是由Dijkstra发明的,他是一名伟大的计算机科学家,发明过许多算法,基本思想Dijkstra算法的基本思想是,开始的时候先将最短路径树设为空,每次将顶点加入最短路径树的时候对该顶点延伸出的所有边进行“放松 ”操作。然后先将原点加入到最短路径树中,依次将距离原点最近的点加入到最短路径树中。代码pu

2014-06-25 20:27:44 991

原创 算法8-8:最短路径性质

在计算最短路径之前,往往会先计算最短路径树,也就是计算从一个顶点出发,到其余所有顶点的最短距离。有了最短路径树之后,路径和距离就非常容易实现了:public double distTo(int v) { return distTo[v];} public Iterable pathTo(int v) { Stack result = new Sta

2014-06-24 20:20:40 1371

原创 算法8-7:最短路径接口

最短路径问题就是给定一个图,这个图中的边是有方向和权重的。求s到t的最短路径。最短路径问题其实分为很多种。按照起点和终点来分,可以分为:从一个顶点到另一个顶点从一个顶点到其他所有顶点从所有顶点到所有顶点按照边的权重来分可以分为:非负权任意权欧几里德权按照是否有环可以分为

2014-06-24 20:18:51 1076

原创 算法8-6:最小生成树研究现状

目前已经介绍了Kruskal和Prim算法,他们的复杂度一个是E logE一个是E logV,那么有没有复杂度为E的算法呢?理论上是可能的,但是目前还没有发现该算法。下图是最小生成树算法的发展过程。从图中可以看到复杂度越來越接近E。最小生成树的应用欧几里德最小生成树问题描述:给定一系列点的坐标,求包含所有点

2014-06-20 19:48:04 1682

原创 算法8-5:Prim算法

Prim算法用于计算最小生成树。Prim算法分为两种,一种是懒汉式,一种是饿汉式。懒汉式Prim懒汉式Prim算法步骤如下:首先将顶点0加入到MST中从MST与未访问顶点之间边中选出最短的边,在满足MST的前提下,将这条边加入到MST代码import java.util.LinkedList;import jav

2014-06-20 19:47:27 1368

原创 算法8-4:Kruskal算法

Kruskal算法用于计算一个图的最小生成树。这个算法的步骤如下:按照边的权重从小到达进行排序依次将每条边增加到最小生成树中,除非这条边会造成回路实现思路第一个步骤需要对边进行排序,排序方法在之前的章节中已经介绍了很多,可以使用优先级队列进行实现,也可以使用归并排序进行实现,这里采用归并排序。第二个步骤需要判断是否会造

2014-06-20 19:46:32 1066

原创 算法8-3:权重图接口

在正式编写最小生成树的算法之前,还需要做一些准备工作。具体的工作就是建立一些基础对象。边首先需要建立边的对象。现在的边要增加权重信息,一条边需要记录两个端点以及这条边的权重,因此边类的轮廓如下:public class Edge implements Comparable { public Edge(int v, int w, double we

2014-06-20 19:45:13 1607

原创 算法8-2:最小生成树贪婪算法

为了简化问题,我们需要作出一些假设。假设图中每条边的权重都是不一样的,假设整个图是连通的。这样假设的目的就是让最小生成树的计算结果是唯一的。图的切割介绍算法之前,需要先了解图的切割。图的切割就是将顶点分割成两部分,切到的边称之为交叉边。下图红色的先就是交叉边。在最小生成树中,无论如何切割,最小生成树总是从交叉边中选择最小的

2014-06-19 20:25:47 1424

原创 算法8-1:最小生成树简介

最小生成树是图论中的一个概念。首先介绍一下什么是生成树。生成树就是将一个图中所有的顶点全部连接在一起,并且保证图中没有出现回路。下图不是生成树,因为没有连接所有的顶点。下图不是生成树,因为图中有回路。像下图这样的才是生成树。生成树的概念介绍完了。那么最

2014-06-19 20:23:57 979

原创 算法7-11:强连接部件

首先介绍什么是强连接。顶点之间的强连接就是如果v能到达w,那么w也能到达v。顶点之间的强连接就表示顶点之间可以双向到达,也就是说两个顶点在一个回路上。介绍了强连接,那什么是强连接部件呢?强连接部件就是能够相互到达的所有顶点的集合。一个图中可能会有多个强连接。强连接在离散数学中属于等价关系,也就是说它具有反射性,相反性,传递性。应用

2014-06-18 19:01:11 2152

原创 算法7-10:拓扑排序

在一个软件工程项目中,有些任务需要在另外一个任务完成之后才能完成,这种任务在软件工程中是非常常见的。下图就展示了一个软件项目的依赖情况。这张图非常明显,就是一张有向图。那么,现在问题就来了,如何输出任务的完成顺序呢?这个问题有一个前提条件,就是有向图中不能出现回路。算法的基本思想就是在每次dfs返回时将顶点加入到返回结

2014-06-18 19:00:16 1228

原创 算法7-9:有向图搜索算法

深度优先算法问题给定一个有向图,判断其顶点能否到达另外一个顶点。解决办法使用深度优先算法,和无向图中的是一样的。代码import java.util.Stack; /** * Created by caipeichao on 14-6-11. */ public class Digrap

2014-06-18 18:58:56 2754

原创 算法7-8:有向图接口

有向图和无向图在编程中的表示方法是差不多的,本问介绍邻接表表示方法。有向图对象的代码轮廓如下:public class Digraph { public Digraph(int v) { } // 创建v到w的边 public void addEdge(int v, int w) { } // 获取v能直接到达

2014-06-18 18:57:33 982

原创 算法7-7:有向图简介

有向图就是在无向图的基础上进行改进,使得每条边都有方向。应用有些公路只能单个方向行驶。如果要对地图建立数学模型,那用有向图就比较方便了。下图是政府博客之间的引用关系,也是有向图。下图是银行之间的贷款联系,用的也是有向图。电路中的二极

2014-06-18 18:55:57 1544

原创 算法7-6:图论中的难题

二部图难度:★★二分图是图论中的一种特殊模型,指顶点可以分成两个不相交的集使得在同一个集内的顶点不相邻(没有共同边)的图。下图是一个二分图的例子,红点之间不会相邻,白点之间不会相邻。判断图中是否存在环难度:★★通过深搜就可以解决了。欧拉环

2014-06-17 20:05:51 1385

原创 算法7-5:连接部件

同学们一定用过Windows中的画图吧。那么画图中的油漆桶功能是如何实现的呢?这个问题可以通过DFS深度优先搜索解决。目标我们要实现的目标是在常数的时间内判断某两个节点是否连接。前面章节中介绍了并查集算法,并查集确实可以解决这个问题。我们今天来介绍另外一种办法,那就是DFS深搜。

2014-06-17 20:04:49 1063

原创 算法7-4:宽度优先搜索

宽度优先搜索的基本思想就是先将源点添加到一个队列中, 每次从队列中取出一个顶点,将该顶点的邻居顶点中没有拜访过的顶点都添加到队列中,最后直到队列消耗完毕为止。应用宽度优先搜索可以解决最短路径问题。而最短路径算法在互联网中应用非常广泛,尤其是路由这块。因为路由追求的是高效,所以每个路由路径都是通过最短路径计算出来的。如果没有最短路径算法,我们可能就享受不到这么快的

2014-06-17 20:02:51 1246

原创 算法7-3:深度优先搜索

深度优先搜索最初是因为迷宫游戏而诞生的。在一个迷宫中,有一个入口和一个出口,其中只有一条路径能从入口到达出口。在走迷宫的时候,每次将走过的地方进行标记,遇到死胡同的时候可以沿着进来的路线后退,找到新的没走过的拐角再尝试新的路线。这种方法的效率很高,因为每个地方只需要走过一次即可。其实,这就是深度优先搜索。深度优先搜索的目标就是系统化地遍历整个图,让算法的效率更高。

2014-06-17 20:02:05 1013

原创 算法7-2:图论接口

本节介绍如何在程序中表示一张图。顶点在程序中,顶点用整数表示就可以了。因为整数可以作为数组的下标,也可以作为哈希表的键。所以用整数是最方便的。当然,在一张图中可能会出现一些异常情况,比如自己连接自己,两个顶点之间存在多个边。这些异常情况也是要考虑的。接口为了表示一张图,就要创建专

2014-06-17 20:00:59 1114

原创 算法7-1:图论简介

无向图无向图由顶点和边组成,边用于连接两个顶点。下面这张地图就是无向图的一个例子。OPTE工程OPTE工程的目标就是绘制整个互联网的样子。下图是2010年的互联网。互联网也是无向图的一个例子。这张图是用LGL软件进行绘制的。有兴趣的同学可以研究一下:http://www.opte.org/

2014-06-16 19:07:06 1094

原创 算法6-6:哈希表应用之字典应用

该应用的目标是实现CSV文件的查询操作。运行举例java QueryCSV dns.csv 0 1baidu.com123.125.114.144zjgsu.edu.cn202.96.99.58代码代码中使用了普林斯顿大学的Java标准库,请戳这里下载:http://introcs.cs.princeton.edu/java/stdlib/

2014-06-16 19:05:18 1130

原创 算法6-5:哈希表应用之集合

可以通过哈希表实现高效的集合操作。接口一个集合对象可以包含了以下接口:public interface Set> { public void add(Key key); public boolean contains(Key key); public void remove(Key key); public int siz

2014-06-16 19:03:41 987

原创 算法6-4:哈希表现状

战争故事很久很久以前,曾经发生过很多关于哈希函数的战争故事。那些战争的基本原理就是通过精心构造造成大量的哈希冲突从而占用大量的CPU资源。被攻击的软件例有以下例子:带有漏洞的服务器:攻击者精心构造哈系冲突,只需要56K的网速就能让服务器死机,从而达到DOS攻击的目的。Perl 5.8.0:攻击者精心构造哈系冲突插入到关

2014-06-16 19:02:02 1049

原创 算法6-3:解决哈希冲突之线性探针

线性探针是另外一种解决哈希冲突的办法。这种办法的基本思想就是当遇到哈希冲突时,寻找下一个空位,直到找到空位为止。示例先插入一个值S,如下图。插入其他的一些值,这些值的哈系没有冲突,得到下图的结果。再插入一个值H,由于H与A的哈系冲突,因此需要寻找一个空的位置。找到了空位

2014-06-16 19:00:14 1872

原创 算法6-2:解决哈系冲突之独立链表

独立链表是解决哈希冲突的一种办法。它的基本思想就是将哈希值相互冲突的几个对象放到一个链表中。代码public class HashST { private static class Node { Object key; // 由于无法创建泛型数组,只能将对象设置为Object类 Object value; Node n

2014-06-13 20:05:58 1159

原创 算法6-1:哈希函数

在上章节中已经介绍了通过红黑树实现键值对数组的查询操作,复杂度是logN。有没有性能更好的算法呢?答案是有。基本想法就是计算关键字的哈希值,再通过哈希值直接获取对应的键值。这种方法的需要解决的问题是:如何计算哈希值如何解决哈系冲突哈希函数目标根据对象中的成员变量的值,按照一定的规则计算出一个

2014-06-13 20:05:07 1215

原创 算法5-8:矩形相交

在70年代,计算机已经发展了一段时间,芯片的规模也越来越复杂。因此人们不得不发明一些芯片设计的软件,在软件中完成芯片的设计、调试工作。当时,模拟运行的时候根据电路的设计,模拟的过程中需要不断地判断矩阵是否相交。那时候还没有很好的算法,人们只能通过暴力手段逐个判断矩阵是否相交。在今天看来,这种算法的复杂度是N^2。根据摩尔定律,计算机CPU每隔18个月,晶

2014-06-13 20:03:08 1219

原创 算法5-7:区间搜索

区间搜索问题就是给定一系列区间,和一个待测区间,求与待测区间相交的区间。为了解决这个问题,需要专门编写一个类,这个类的接口如下:public interface IntervalST, Value> { void put(Key lo, Key hi, Value value); Value get(Key lo, Key hi) voi

2014-06-13 20:01:08 1601

原创 算法5-6:Kd树

问题给定一系列的点,和一个矩形。求矩形中包含的点的数量。解答这个问题可以通过建立矩阵来进行求解。首先将一个空间分割成矩阵,将点放置在对应的格子中,再计算矩形覆盖的格子,再判断格子中的点是否包含在矩形中这种方法的问题是,可能这些点全都集中在一个格子中。这种情况下算法的效率比较低。

2014-06-13 20:00:06 1176

原创 算法5-5:线段交叉问题

问题给定一系列线段,每条线段可以是水平或者竖直。求相交的线段解决算法的基本思想是先将线段以x坐标进行排序。做一条扫描线,从左往右扫描,也就是下图中的红线。当进入一条水平的线时,记录该线段的y坐标。当走出水平线时,从二叉查找树中删除该线段的y坐标。

2014-06-11 19:08:33 2086

原创 算法5-4:1d范围查找

有一个整数集合,求所有介于x到y之间的所有整数实现方法非顺序数组:复杂度是N,比较慢顺序数组:查找操作的复杂度是lgN,插入操作的复杂度是N二叉查找树:复杂度是logN,比较快代码下面这段代码用于统计lo到hi之间的整数个数public int count(Key lo, Key hi) { i

2014-06-11 19:07:24 1134 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除