代码改变世界

随笔分类 -  数据结构和算法

插入排序

2012-07-29 12:39 by coodoing, 422 阅读, 收藏, 编辑
摘要: 1、算法原理介绍: 直接插入排序是一种最简单的排序方法,通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。即先将第1个记录看作是一个有序的记录序列,然后从第2个记录开始,依次将未排序的记录插入到这个有序的记录序列中去,直到整个文件中的全部记录排序完毕。 2、可视化操作: 具体的实现步骤为: 插入x之前: 插入x之后: 伪代码如下: 1: ... 阅读全文

排序算法

2012-07-29 11:14 by coodoing, 727 阅读, 收藏, 编辑
摘要: 先给出比较有意思的一些网址:可视化的数据结构和算法和一些有意思的算法代码以及排序算法的动画演示。后续主要对常见的几种算法进行研究和分析,在分析的同时并适当的配以简单的可视化教程,方便理解。1、插入排序2、选择排序3、冒泡排序4、快速排序5、堆排序6、归并排序7、计数排序,基数排序和桶排序常见几种算法的比较,详细可参考算法性能比较: 阅读全文

整数划分问题

2012-07-29 10:28 by coodoing, 508 阅读, 收藏, 编辑
摘要: 所谓整数划分,就是将一个正整数n划分为一系列的正整数之和,如将n可以划分为:{m1,m2,m3,m4,m5..mk}(1=<k<=n),则{m1,m2,m3,m4,m5..mk}就是n的一个整数划分。下面我们要做的是,要找到所有的n的正整数划分。 我们该如何找出所有的划分呢? 我们可以先来看看整数划分的规律: 譬如正整数:6 划分情况如下: 6 5+1 4+2 4+1+1 3+3 3+2+1 3+1+1+1 2+2+2 2+2+1+1 2+1+1+1+1 1+1+1+1+1+1 观察第一列的数字发现,我们划分过程中总是按照比6小1,小2,小3,小k,的顺序来依次排列它的划分,第一列 阅读全文

Permutation&Combination递归实现

2012-07-28 21:20 by coodoing, 809 阅读, 收藏, 编辑
摘要: (1)关于字符串排列的问题输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。解题思路:固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。在交换b和a之后,再拿c和处在第一位置 阅读全文

DFS应用:SCC

2012-07-12 18:31 by coodoing, 590 阅读, 收藏, 编辑
摘要: 本文利用Kosaraju’s Two-Pass Algorithm 解决强连通子图问题。 Kosaraju算法是求解有向图强连通分量(strong connected component)的三个著名算法之一(另两个算法为Tarjan和Gabow),能在线性时间求解出一个图的强分量。三种算法具体的差别可参考:http://www.cppblog.com/koson/archive/2010/04/27/113694.html 什么是强连通分量?在这之前先定义一个强连通性(strong connectivity)的概念:有向图中,如果一个顶点s到t有一条路径,t到s也有一条路径,即s与t互相可达. 阅读全文

图的DFS遍历

2012-07-12 17:39 by coodoing, 740 阅读, 收藏, 编辑
摘要: 深度优先搜索(Depth-First Search—DFS)是指按照深度方向搜索,它类似于树的先根遍历,是树的先根遍历的推广 深度优先搜索连通子图的基本思想是: 假设图G初态为所有顶点未被访问(visited[i]=false),从G中任选一顶点vi :从该顶点vi出发,首先访问vi,,置visited [vi ]=true;然后依次搜索vi的每一个邻接点vj ;若vj未被访问过,则以vj为新的初始出发点,重复1;若vj已被访问过,则返回到vi另一个邻接点,重复3如果经过1、2、3后,图中仍有未被访问的顶点,再从中任选一顶点,重复1、2、3,直至所有顶点都被访问过,遍历结束。以无向连通图为例. 阅读全文

图的邻接表实现

2012-07-11 22:49 by coodoing, 1313 阅读, 收藏, 编辑
摘要: 邻接表相关介绍 邻接表(Adjacency List)是图的一种链式存储方式。在邻接表中,对每个顶点(即表头节点)建立一个单链表,第i个单链表中节点表示依附于顶点vi 的边(对有向图而言,是以顶点vi为尾的弧)。所以在邻接表中,除了节点外,还有表头节点。 数据结构定义如下节点和表头节点的结构定义如下具体数据结构定义如下:ArcNode表示表节点,VNode表示头节点,ALGraph表示图class ArcNode { int vex; //弧指向的顶点的位置 ArcNode next; //指向下一条弧的指针 String info; //该弧相关信息 double ... 阅读全文

贪心算法之哈夫曼编码

2012-07-10 15:48 by coodoing, 8472 阅读, 收藏, 编辑
摘要: 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。给出现频率高的字符较短的编码,出现频率较低的字符以较长的编码,可以大大缩短总码长。定长码:3*(45+13+12+16+9+5) = 300 千位变长码:1*45+3*13+3*12+3*16+4*9+4*5 = 224 千位1、前缀码对每一个字符规定一个0,1串作为其代码,并要求任一字符的代码都不是其它字符代码的前缀。这种编码称为前缀码。编码的前缀性质可以使译码方法非常简单。表示最优前缀码的二叉树总是一棵完全二叉树,. 阅读全文

JAVA-二叉线索树(Threaded binary tree)

2012-07-10 11:27 by coodoing, 1344 阅读, 收藏, 编辑
摘要: 二叉线索树(Threaded binary tree)基础知识二叉树是一种非线性结构,对二叉树进行遍历时,实际上那个是将二叉树这种非线性结构按某种需要转化成线性序列,但每次遍历二叉树时,都要用递归对其进行遍历,当二叉树的节点较多时,这样的效率是很低的。所以我们有没有办法把我们遍历的二叉树保存,方便以后遍历呢?在一棵只有n个结点的二叉树中,假设有n个结点,那么就有2n个指针域,因为二叉树只用到了其中的n-1个结点,所以只要利用剩下的n+1个节点,我们就能把中需遍历时所得到的中序二叉树保存下来,以便下次访问。中序二叉树的指针域有两种类型:一是用于链接二叉树本身;二是用于链接中序遍历序列。这类型的指 阅读全文

二叉树的基本遍历方法

2012-07-09 17:16 by coodoing, 295 阅读, 收藏, 编辑
摘要: View Code 1 package Tree; 2 3 import java.util.Stack; 4 public class BinaryTreeTraversal { 5 protected Node root; 6 7 public BinaryTreeTraversal(Node root) { 8 this.root = root; 9 } 10 11 public Node getRoot() { 12 return root; 13 } 14 15 /** 构造树... 阅读全文

二叉树的基本操作

2012-07-09 17:06 by coodoing, 270 阅读, 收藏, 编辑
摘要: 主要利用java实现了二叉树的一些基本操作:获取树的深度;添加、删除节点获取左右兄弟节点简单的递归中序遍历。。后续会提供前序,后序遍历的方法以及非递归遍历的方法BinaryTree 1 package Tree; 2 3 class BTNode { 4 int data; 5 BTNode left; 6 BTNode right; 7 8 public BTNode(int data) { 9 this(data, null, null); 10 } 11 12 public BTNode(int d... 阅读全文

队列,链表及二叉查找树

2012-07-08 11:34 by coodoing, 298 阅读, 收藏, 编辑
摘要: Queue(链式队列)Queuepackage Queue;class QNode<T> { T data; QNode<T> next; public boolean equals(QNode<T> node) { if (data.equals(node.data)) { return true; } return false; } public int hashCode() { return data.hashCode(); }}class LinkQueue<T> { ... 阅读全文
点击右上角即可分享
微信分享提示