- 博客(13)
- 资源 (1)
- 收藏
- 关注
原创 红黑树之java实现
package cai.tree;import java.io.*;import java.util.*;class RedBlackTree{ private class RBNode{ public E data; public RBNode parent; public RBNode left; public RBNode right; public int col; pu
2010-06-23 16:27:00 570
转载 红黑树
<br />红黑树也是一种比较常用的数据结构,网上有篇介绍的比较清楚的,转载如下:http://imlazy.ycool.com/post.1104022.html<br /> <br />红黑树(Red-Black Tree)是二叉搜索树(Binary Search Tree)的一种改进。我们知道二叉搜索树在最坏的情况下可能会变成一个链表(当所有节点按从小到大的顺序依次插入后)。而红黑树在每一次插入或删除节点之后都会花O(log N)的时间来对树的结构作修改,以保持树的平衡。也就是说,红黑树的查找方法与二
2010-06-23 16:25:00 344
原创 AVL树
AVL树是普通二叉查找树的变形,查找效率会比红黑树好,但是由于要求更严格,所以插入和删除比红黑树消耗大。定义:1>它的左子树和右子树都是AVL树 2>左子树和右子树的高度差不能超过1 从条件1可能看出是个递归定义,如GNU一样. 性质:1>一棵n个结点的AVL树的其高度保持在0(log2(n)),不会超过3/2log2(n+1) 2>一棵n个结点的AVL树的平均搜索长度保持在0(log2(n)). 3>一棵n个结点的AVL树删除一个结点做平衡化旋转所需要的时间为0(log2(n)). 性能:实际效率和插入
2010-06-22 09:14:00 537
原创 二叉查找树
二叉查找树也是一种比较常见的数据结构,在实际应用中一般是用二叉查找树的变形,如AVL树,红黑树。例如stl中的map就是红黑树的应用。a)下面是红黑树的java实现,包括: 1)递归实现的contains函数 2)递归和非递归实现的insert操作。 3)递归和非递归实现的remove操作。b)啰嗦几句java,java没有像c++那样功能强大的指针可以指针指向指针,也没有c++一样的引用。java的引用其实和c++的一层指针大概是差不多的。所以有些事情java没办法做,例如交换函数swa
2010-06-20 12:00:00 409
原创 二叉树的遍历
二叉树是树中最重要的数据结构。在算法中回溯,分支限界就是对解空间树遍历的应用,解空间树是在遍历中生成。下面是对二叉树遍历的非递归代码,包括两种后序,两种中序,三中先序。a)以中序为例两种程序在本质上是一样的都是自“底”向“上”访问,只不过traverse_1空指针不入栈,traverse_2空指针入栈。其本质都是:要弹出栈访问的节点其左子树必定已经访问过,则只需要将节点弹出使树在此节点断裂变成两棵子树root和p.rigth。如果p.right不为空则访问之,否则p=null继续访问root.b)在后序遍历
2010-06-19 14:47:00 499
原创 类广义表到树
树是一种重要的数据结构,下面是如:(a b(c d) aa (bb cc dd) ee(ff ( gg (h i j)))) 这样的类广义表读入一颗树的程序。a)在括号里面的表示为上个符号的子节点,如 c , d为b的子节点。a和b为兄弟节点。b)又有nextToken程序。----------------------------------------------------------------------------------------------------------------------
2010-06-17 13:36:00 581
原创 字符串之KMP
KMP是字符串匹配的常见算法有多种变形,下面仅仅讨论下经典的KMP算法:a)kmp算法主要是先计算Pattern串p的特性,利用的是一个nextPos[]数组。 1)nextPos[0] == -1; 2)如果nextPos[j] == k,则:'p0 ... pk-1' == 'pj-k+1 ... p j-1' (1 k满足此等式,即k是最大的。 3)原理是:如果主串的第i个char和pattern的第j个char不匹配那么Pattern向前移动,直到主串和Pattern的第k个
2010-06-16 17:16:00 368
原创 Stack应用之中缀->后缀
中缀变后缀也是Stack的一个应用。原理也比较简单:a)operatorPri函数比较运算符的优先级。b)主运行函数toProcess: 1)如果是变量则直接输出。 2)如果是运算符则: 1。如果栈为空则直接进栈。 2。如果当前运算符优先级高于栈顶运算符则当前运算符进栈。 3。如果当前运算符优先级低于栈顶运算符则栈顶运算符出栈并输出,直到栈为空或栈顶运算符优先级第于当前运算符。 4。如果优先级相等,则一定为左右括号匹配,栈顶运算符(“(”)出栈即可。
2010-06-14 22:35:00 406
原创 Stack应用之进制转换与迷宫问题
栈可以用链表来实现,表现为后进先出。具体实现就不详细说了。下面直接看两个问题:u 进制转换:1)进制转换是基于以下公式1:N = (N div d) * d + N mod d (div为整除运算,mod为求余运算)2)一个d进制数n1n2n3n4n5 可表示为((((n1 * d + n2 ) * d ) + n3) * d + n4) * d) + n5或者表示为:n1*d^4 + n2*d^3 + n3*d^2 + n4*d + n53)递归应用公式1,即可得到d进制的数。DecTo
2010-06-14 14:05:00 488
原创 链表之ArrayList
链表是最经常用的数据结构之一,可以是栈和队列的实现的基础。下面直接上代码:a)modCount 在AbstractList中定义。用来表示链表改变的次数。b)注意 RangeCheck函数。c)这里没提及Iterator类,其中iterator类在AbtractList中有一个内部类Itr来表示,用iterator()来引入 public Iterator iterator() { return new Itr(); }-------------------------------
2010-06-13 18:52:00 692
原创 数据结构之一(引论及最大子序列和问题)
时间复杂度:1. 大O记号:如果存在正常数c和c0 使得当N>=n0时T(N)在大O记号中比较的其实是“相对增长率”,其实也就是求导后的比较。对于具体的数值是没有意义。比如:某个N使得f(N)当T(N) = O(f(N))时,f(N)是T(N)的一个“上界”。几个结论:结论一:如果T1(N) = O(f(N))且T2(N) = O(g(N)),那么a) T1(N) + T2(N) = O(f(N) + g(N)); 或者写成max( O(f(N)) , O(g(N)) ).b) T1(N) *
2010-06-12 17:24:00 513
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人