`
shenyu
  • 浏览: 122540 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
文章列表

排序-选择

选择排序 ,原理与冒泡 类似,相比之下,交换的时间效率为O(n),比较的时间效率依然为O(n^2) 代码如下,程序简单,没有提供注释。   class Select { public static void main(String[] args) { int[] a = {2,4,6,3,6,2,6,4,9}; sort(a); print(a); } private static void sort(int[] a) { int temp; for(int i=0; i<a.leng ...
与2-3-4树 相似,2-3 平衡树是一种搜索树。 但由于每个节点最多有两个数据,分裂算法需要新插入数据的参与,这导致算法与2-3-4树 有一定的差异。 每个节点可能会有2,3,4个子节点,对应可能会有1,2,3个数据。子节点数=数据数 + 1,不可能有空节点。 插入数据时,树向下遍历以得到恰当的叶子节点时,数据均插入叶子节点,如果子节点需要分裂,则进行节点分裂,分裂产生的新数据向父节点插入,如果父节点是满的,则向上递归调用此过程。当根节点分裂,所有叶子节点的层高都增加一层,以此原理来保证树的平衡。因为分裂需要第三个数据,所以是在插入之后分裂节点的,这与2-3-4树 的插 ...
2-3-4 平衡树是一种搜索树。每个节点可能会有2,3,4个子节点,对应可能会有1,2,3个数据。子节点数=数据数 + 1,不可能有空节点。 插入数据时,数据均插入叶子节点,树在向下遍历以得到恰当的叶子节点时,每遇到满的节点,则进行节点分裂,当分裂向上累积致根节点位置,根节点分裂,所有叶子节点的层高都增加一层,以此原理来保证树的平衡。 此树没有实现删除数据的算法,如果需要,可考虑将数据标志为作废的方式,以避免真正的删除时的复杂。 插入的数据为了简便起见,假设均为Integer,且不会重复。 方法ordinal是升序打印,为的是测试。 Tree.main 函数提供一个简短的测试。 Node类为辅助 ...
用邻接表法表示的双向图(改单向容易,只要修改connect,disconect方法)。 此处只是表示数据结构,没有相关算法。 其中Vertex是辅助类表示顶点,其中包含一个boolean变量isVisited表示是否遍历过。 Graph表示图,实际存储顶点,以及顶点之间的关系,用一个数组存储顶点,另一个数组中存放与对应的顶点的相连的的顶点的下标。 大部分的代码实际是辅助代码,其中包括: Vertex:顶点,其中包含一个Boolean变量,表示是否遍历过。 Node,Link:一个单向链表,存储与当前顶点向邻的节点的下标。(单向链表的详细描述见:Link ) Graph的另一个实现请参见Graph ...
用邻接矩阵法表示的双向图(改单向容易,只要修改connect,disconect方法)。 此处只是表示数据结构,没有相关算法。 其中Vertex是辅助类表示顶点,其中包含一个boolean变量isVisited表示是否遍历过。 Graph表示图,实际存储顶点,以及顶点之间的关系(用二维数组表示) 另一个实现请请参见 class Vertex { private Object value; private boolean isVisited; Vertex(Object value) { this.value = value; } void visit() { isVisited ...
用下面这个例程测试同样的赋值通过反射方式,和通过普通方式(set方法)下的效率差别。 在作者当前的系统下(Linux:ubuntu7.10 java-sun-6): 反射赋值:set方式 =  170:1  或者  171:2 效率差别还是比较明显。 import java.lang.reflect.*; class Person { private int age; public void setAge(int age) { this.age = age; } } class Test { private static final int TIMES = 10000 ...
这里的堆不是java中内存分配的堆。只是一种数据结构。 堆是二叉满树,满足条件:父节点的键值大于两个子节点的键值,这不同于二叉搜索树(见Tree),堆对于实现优先级队列是一种好的方式,相对于利用数组的优先级队列 ,利用链表的优先级队列 来说,其插入与删除的效率都是O(log n) 此堆的实现使选择数组作为内部数据结构,使得此堆能容纳的数据有限,但找到最下一层的作右子节点比交方便。用数组存储树时,求当前节点的父节点和左右子节点的公式如下:假设当前节点坐标为x: 父节点:(x-1)/2 左子节点:2 * x + 1 右子节点:2 * x + 2 API如下:     Heap:构造并指定需要的空间大 ...
功能上于前面两个HashTable(-) ,HashTable(二) 一致,但实现上采用的链表表示每个Hash桶的位置,这样理论上不用考虑容量问题。实际中HashTable中的每个SortLink太长会导致效率低下,因此HashTable的初始大小比较重要。 链表使用的是有序链表SortLink,这样查找,删除的效率会提高一半,但是新增则会从O(1)降到链表的平均长度的一半。考虑链表不是太长,所以不会对效率产生太大的影响。但终究来说,这种实现更适合查询,不适合大量反复的插入。 关于可以插入的数据的键值,此处假设为整数。 代码中有许多辅助类 其中: Item:装载有key(关键值)的数据 Node ...
与前一个HashTable 基本相同(方法说明请参照它),只是当发生Hash冲突时,采用再用哈希法探测步长。 前面当发生Hash冲突时,直接看当前位置下一个有没有空位,这相当于步长为一,但这容易产生聚集,大的聚集产成后Hash的效率会下降,采用Hash法采用的是使用不同的Hash函数来产生一个新的步长。 新的hash有以下要求 非0 与第一个Hash函数不同 除此之外: 这个HashTable的size要求是质数,因此是靠程序自己计算出来的。 基于链表的HashTable请参见HashTable public class Item { private int key; priv ...
该HashTable基于定常数组的开放地址法,搜索时采用线性探测发 由于删除时使用标志的做法,因此该HashTable常作删除会导致效率的下降。 为了保证此表的操作效率,数组的大小为所需要存储的数据的两倍。如果再细致一些,应该是大于其两倍的的第一个质数,这样可以减小Hash冲突的可能性,不过这里没有这样作,同样是为了代码清晰。 HashTable的遍历不占优势,此处没有实现。 API find:查找指定键的数据项目 add:添加新数据 remove:删除指定键的数据项目 Item为辅助类,为了简便,关键字使用非负整数,且没有采用标准的set,get方法 HashTable.main提供一个简便的 ...
每个节点最多两个子节点,其中左边节点的值小于该节点的值,右边节点的值大于该节点的值。为了简便起见,该二叉树装入的数据为整数,且不允许有重复的关键字值。 编程中为了简便,采用了递归算法,运算时会带来额外的开销,如果能将相应的算法替换为迭代,则更为有效。删除的算法相应复杂一些,但也可以承受。 API add:将数加入树 remove:从树中删除指定的节点 contains:树中是否包含指定的数 ordinal:从小到大遍历打印数(测试只用) max:查找最大值 min:查找最小值 其中Node类是辅助类,为了简单没有写标准的 get,set方法。 因为该树没有自我保持平衡的能力,因此对于随机插入 ...
提供一个基于链表的优先级队列,为了简便,只存储整数,假设数值越大,优先级越高。工作时该队列按照数值的大小排列,出队时出优先级别最高的元素。这已经不是普通意义上的队列(先进先出),叫优先级队列只是习惯。put:入队get:出队isEmpty:是否为空 普通队列请参见LinkedQueue,Queue相对与另一个实现(PriorityQueue),这个优先级队列没有容量的限制。Node是辅助类,提供节点的数据结构,为了简便,没有使用标准的set,getclass Node { private int value; private Node next; Node(int value) { ...
提供一个基于定长数组的优先级队列,为了简便,只存储整数,假设数值越大,优先级越高。工作时该队列按照数值的大小排列,出队时出优先级别最高的元素。这已经不是普通意义上的队列(先进先出),叫优先级队列只是习惯。构造函数:初始化队列大小put:入队get:出队isEmpty:是否为空 普通队列请参见LinkedQueue,Queue另一个实现基于定长数组,见(PriorityQueue) class PriorityQueue { private int[] array; private int top = -1; PriorityQueue(int capacity) { array = ...

Queue 队

指定最大值的队,底层用数组实现构造函数:指定最大容量put:放入get:取出isEmput:是否为空其他实现请参考LinkedQueueclass Queue { private int length; private int begin = -1; private int end = -1; private int[] array; Queue(int capacity) { array = new int[capacity]; } void put(int value) { assert length < array.length; if(end == ...
用Array实现的栈结构,功能与LinkedStack一致编程上略微比LinkedStack复杂class ArrayStack { private Array array = new Array(); private int pos = -1; void push(int value) { array.set(value,++pos); } int pop() { assert pos > -1; int result = array.get(pos); array.truncate(pos--); return result; } boolean ...
Global site tag (gtag.js) - Google Analytics