数据结构
JavyZheng
这个作者很懒,什么都没留下…
展开
-
二叉查找树 Java实现
public class BinarySearchTree > { //内部节点类 private static class BinaryNode{ //构造器 BinaryNode(AnyType theElement){ this(theElement, null, null); } BinaryNode(AnyType theElement, BinaryNode转载 2013-08-07 22:53:04 · 853 阅读 · 0 评论 -
图算法 单源最短路径问题 无权最短路径
单源最短路径问题给定一个赋权图 G = (V, E)和一个特定顶点s作为输入,找到s到G中每一个其他顶点的最短赋权路径。无权最短路径转载 2013-10-07 17:51:23 · 4217 阅读 · 0 评论 -
表
//List接口public interface List extends Collection{ AnyType get(int idx); AnyType set(int idx, AnyType newVal); void add(int idx, AnyType x); void remove(int idx); ListIterator listIterator(int pos);}转载 2013-08-06 23:26:49 · 728 阅读 · 0 评论 -
动态规划
动态规划转载 2013-10-16 21:47:54 · 714 阅读 · 0 评论 -
红黑树 自底向上和自顶向下插入, 自顶向下删除
本文主要参考 Mark Allen Weiss 的 Data Structures and Algorithn Analysis in Java (Second Edition) 的中译本,对其中省略的地方进行了补充。什么是红黑树?红黑树本质上是二叉查找树,但增加了一些性质,使这种二叉查找树更加平衡,使得对其操作最坏情况花费O(logN):1) 每一个节点或者为红,或者为黑;2)转载 2013-10-06 12:01:51 · 4388 阅读 · 0 评论 -
图算法 图的表示(邻接表和邻接矩阵)和拓扑排序
图的表示图有两种表示方法,分别是邻接矩阵和邻接表。这里以有向图为例说明。邻接矩阵邻接矩阵是一个二维数组A。对于每条边 (u,v),置A[u][v]等于true;否则,数组元素为false。如果边有一个权,那么可以置A[u][v]等于该权,而使用一个很大或者很小的权作为标记表示不存在的边。它的空间需求为Θ(|V|^2)。邻接表大多数情况,图都是比较稀疏的,转载 2013-10-07 14:26:23 · 6998 阅读 · 0 评论 -
图算法 最小生成树 Prim算法 Kruskal算法
最小生成树一个无向图G的最小生成树就是由该图的那些连接G的所有顶点的边构成的树,且总价值最低。Prim算法Prim算法把每一个节点一个一个加在最小生成树上,是贪心算法。算法的每一阶段都可以通过选择边(u,v)使得(u,v)的值是所有u在树上但v不在树上的边的值中最小者而找到一个新的顶点并把它添加到这棵树中。下面示意从v1开始构建最小生成树Kruskal算法转载 2013-10-07 22:52:49 · 1601 阅读 · 0 评论 -
图算法 Dijkstra算法 赋权图的单源最短路径
Dijkstra是解决有向赋权图单源最短路径问题的算法,是贪心算法的典型代表。1. 在每个阶段,Dijkstra算法选择一个顶点v,它在所有unknown顶点中具有最小的dv,同时算法声明从s到v的最短路径是known的。2. 更新dw值,若dv + c(v,w)是一个改进的值时,我们就置dw = dv + c(v,w)。顶点Vertex的定义如下:class Vertex{转载 2013-10-07 21:07:36 · 2985 阅读 · 0 评论 -
图算法 具有负边值有向图的单源最短路径
Dijkstra对具有负边值得图是无效的。对于负边值得图:1. 开始时,把s放进队列2. 在每一阶段让一个顶点v出队,找出所有与v邻接的顶点w,使得dw > dv + c(v,w)。更新这些点的dw和pw,并在w不在队列中的时候把它入队。(可以为每个顶点设置一个比特位以指示它是否在队列中)。3. 重复以上过程直到队列为空。void weightedNegative(Vert转载 2013-10-07 21:24:12 · 3105 阅读 · 1 评论 -
栈和队列
public class MyLinkedQueue { private Node first = null; private Node last = first; private int N = 0; private class Node{ public AnyType item; public Node next; } public boolean isEmpty转载 2013-08-07 09:33:54 · 672 阅读 · 0 评论 -
图算法 无圈图和关键路径分析
无圈图如果已知图是无圈的,则可以利用拓扑顺序选择顶点来改进Dijkstra算法。由于选择和更新可以在拓扑排序执行的时候进行,因此算法能够一趟完成。因为当一个顶点v被选取之后,按照拓扑排序法则它没有从unknown顶点发出的进入边,因此它的距离dv可不再被更新。这样的话,就不需要优先队列了。运行时间为O(|E| + |V|)。关键路径分析如图,每个节点表示一个必须执行的动作以转载 2013-10-07 21:56:22 · 3555 阅读 · 0 评论 -
递归问题(Recursive)
定义当一个函数用它自己来定义时就称为是递归的。基本原则1. 基本情形。必须总要有某些基准的情形,它们不用递归就能求解。2. 不断推进。对于那些要递归求解的情形,递归调用必须总能够朝着一个基准情形推进。例子转载 2013-10-16 21:35:18 · 1187 阅读 · 0 评论 -
伸展树
伸展树的基本想法是: 当一个节点被访问过后,它就要经过一系列AVL树的旋转被推到根上。 因为很多时候,当一个节点被访问时,它很可能不久再被访问。未完待续。转载 2013-08-08 21:31:07 · 649 阅读 · 0 评论 -
散列表 hash
分离链接法public class SeparateChainingHashTable { //构造器 public SeparateChainingHashTable(){ this(DEFAULT_TABLE_SIZE); } public SeparateChainingHashTable(int size){ theLists = new LinkedList[nex转载 2013-08-08 22:27:40 · 1353 阅读 · 0 评论 -
二叉堆
二叉堆是一棵完全二叉树,这个性质保证二叉堆可以用一个简单数组(Array)表示。根元素放在 Array[ 1 ] 处(Array[ 0] 不使用)。对数组中任一位置i上的元素,其左二子在位置2i上,右儿子在左儿子后的单元 2i+1 上,它的父亲则在位置 ⌊ i/2 ⌋ 上。堆序性质堆中任意节点小于它的所有后裔(最小元素在跟上)。insert在下一个可用位置创建一个空转载 2013-10-17 11:56:45 · 934 阅读 · 0 评论 -
图算法 网络流问题
一个有向图G = (V,E),边容量为c(v,w)。一个发点s,一个收点t。最大流问题是确定s到t可以通过的最大流量。左边为原图G,中间位流图Gf,表示算法任意阶段已经达到的流(初始为0),右边为残余图Gr,表示对于每条边还能再添加上多少流。在每个阶段,寻找Gr中从s到t的一条路径(增长通路)约定,一旦注满一条边,则这条边就要从残余图中除去。当发现Gr中没有通路时算法终止。转载 2013-10-07 22:22:49 · 1906 阅读 · 0 评论 -
AVL树
一棵AVL树是每个节点的左子树和右子树的高度最多差1的二叉查找树。每一个节点保留高度信息。 //私有节点类 private static class AvlNode{ //构造器 AvlNode(AnyType theElement){ this(theElement, null, null); } AvlNode(AnyType theElement, AvlNo转载 2013-08-08 21:23:19 · 634 阅读 · 0 评论