
java算法
链巨人
这个作者很懒,什么都没留下…
展开
-
拓扑排序
思路: 分别找到没有后继节点的节点,加入数组,删掉,重复动作。package tree;import java.util.ArrayList;import java.util.List;public class TopoTest { public static void main(String[] args) { TopoGraph t = new TopoGraph(16); t.addVe原创 2015-09-15 13:46:39 · 454 阅读 · 0 评论 -
哈夫曼树--顺序结构(建立、编码、解码)
引子: 这里的哈夫曼树的建立方法和上一篇不一样,是把数据放在数组上面的,而不是链表上面。因此,采用这种方法建立的哈夫曼树对节点的操作上比链式的哈夫曼树简单很多。对于空间问题,如果有m个item,那么需要建立2*m长度的数组,具体解释请看下面注释!package tree;import java.util.ArrayList;import java.util.HashMap;import java.原创 2015-09-15 13:46:34 · 2249 阅读 · 0 评论 -
无向图的最小生成树(prim算法)
引子:假设整个无向图中的点记为A,最小生成树中的点记为T,其他点记为Q(也就是Q= A-T),T与Q相连的边记为B算法构造过程:1、初始化:首先将一个点(随意一个)加入最小生成树中2、在所有Q中找到一条权值最小的边B以及对应的点,加入最小生成树3、重复以上过程,直到T=A。原创 2015-09-16 19:10:32 · 2648 阅读 · 0 评论 -
Dijkstra算法--有向图的源点到其他顶点的最短路径(连接矩阵、邻接矩阵两种方式)
引子:Dijkstra算法:某个顶点到其他顶点的最短路径。以下面这个图为例:其中源点是A。关键点:维护一个二维数组,具体见下面:1、首先,派一名调查员驻扎在A处,在A处,a调查员能够知道与A相连的B和D的路径长度,在笔记本上记着下面图片1的信息。接下来选择没有驻扎调查员、和A直接相连以及到A路径最短的点。只有B(50)和D(80)直接和A相连,所以选择B。注意:原创 2015-09-18 13:36:50 · 15049 阅读 · 1 评论 -
无向图的最小生成树(克鲁斯卡尔算法 Kruskal)
引子:克鲁斯卡尔算法 Kruskal的构造过程:1、初始化图:n个顶点,n个连通分量(如果两个顶点的连通分量相同,表示两点在同一个连通图中)。把所有的边(包含两个顶点)放入优先级队列中,从小到大。2、选择最小权重的边,如果这个边的头顶点的和尾顶点的连通分量不同,则合并头和尾两个分量(整个连通图的点都需要修改,具体看代码)。舍弃该边。3、重复第二步,直到所有的顶点都连接着同一原创 2015-09-16 22:20:51 · 4335 阅读 · 1 评论 -
WarShall算法--图的传递闭包(进一步演变成flayd算法)
package graph;import java.util.ArrayList;import java.util.List;public class WarshallTest { public static void main(String[] args) { Warshall w = new Warshall(8); w.addVertex("a"); w.addVertex("b");原创 2015-09-15 13:46:42 · 838 阅读 · 0 评论 -
java位运算应用
1. 判断int型变量a是奇数还是偶数 a&1 = 0 偶数 a&1 = 1 奇数 2. 求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。 (x&y)+((x^y)>>1); http://blog.youkuaiyun.com/liangyihua原创 2015-11-25 09:23:18 · 574 阅读 · 0 评论 -
关于负数的补码
正数的补码、反码是源码本身源码--》补码:对应正数二进制表示的所有位取反,然后加一。补码--》源码:对应正数二进制表示的所有位取反,然后加一。补码的绝对值:(因为整数的补码就是源码,所以这里的补码指的就是负数的补码)若要得到一个负二进制补码的数值,只要对补码全部取反并加1,就可得到其数值。如:二进制值:10111111(-65的补码)各位取反:01000000加1:01原创 2015-11-25 08:45:51 · 2752 阅读 · 0 评论 -
大数相乘--极简单的思路
大数相乘,面试常见的题型,如何计算两个打算相乘?public class Test1 { public void multi(char[] a,char[]b){ int alen = a.length; int blen = b.length; //用于存放最后计算出来的结果 int[]s = new int原创 2015-11-25 22:33:57 · 651 阅读 · 0 评论 -
java实现排序二叉树
* 二叉树排序算法看似很简单,特别是看到其他博客写的实现代码,但是如果把细节各种情况考虑进去,还是不容易的。* 数据使用链式二叉树来存储,在增加节点的时候,小的在父节点的左边,大的在父节点的右边。刚增加的数据都是叶子节点* 在删除的时候,可以有三种情况,分别是:(用a表示当前将要删除的节点)* 第一,如果a是叶子节点,可以直接删除;* 第二,如果a只有一个孩子节点,那么需要把孩子节点上移到a的位置;* 第三,如果a有两个子节点,那么需要找到a的后继节点b(中序遍历),把b移到a的位置,* 这时候原创 2016-01-21 16:52:14 · 649 阅读 · 0 评论 -
数据结构与算法
1、归并排序package com.huai.test;/** * Created by liangyh on 15-12-19. * 归并算法 */public class SortTest { public static void main(String args[]){ SortTest test = new SortTest();原创 2015-12-19 16:45:24 · 516 阅读 · 0 评论 -
计算文本文件中各个词(中英文)出现的频率
要求: 写一个程序,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来。文本文件大小约几百k均可。 解决步骤: 1、读取一个 txt 文本文件; 2、统计文件里面每个词出现的次数; 3、进行排序,打印出频率最高的10个词。 编程语言:java;测试文本:D:\\wordtest.txt 264k性能测试工具:eclipse初步思路: 1、将文件内容存放在原创 2015-09-15 13:44:57 · 1367 阅读 · 0 评论 -
无向图--邻接矩阵、连接矩阵、深度遍历、广度遍历、生成树
1、开始生成的无向图 2、由图深度优先遍历生成的树 package graph;import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.Queue;import java.util.Stack;public cla原创 2015-09-15 13:46:37 · 2351 阅读 · 0 评论 -
用Java实现单向链表
【说明】封装节点类,既用于存储数据data和下一个节点的首地址next,又封装了基本的增删改查的功能。方便以后调用,而不用要用户手工去处理各个节点的关系。//class Link{ private Node root;//the head node public void addNode(String data){ Node newNode = new Node(data); if(thi原创 2015-09-15 13:45:00 · 600 阅读 · 0 评论 -
哈夫曼树--链式结构(建立huffman树、编码、解码)
引子: 用链式结构来建立哈夫曼树。总体思路是: 将每一棵树(这是每一棵树只有一个节点,头节点)放在一个优先队列中(下面的是链表实现的优先队列),频率(rate)小的在队列头,取出队列头两个,频率相加之后组合成一个有三个节点的树,重新放入优先队列中。重复上面的过程,直到最后只剩下一个,则这最后一个便是哈夫曼树。编码:从叶子节点开始往上。解码:从根节点开始往下。package tree;import原创 2015-09-15 13:46:31 · 3569 阅读 · 0 评论 -
用java实现优先级别队列
1、注意:因优先级别最高的元素被删除后,其后边的数都会往前移动,所以不会出现“假溢出”。所以不用设计成循环队列2、包和类的结构截图:3package com.test3;public class Element { private Object elem;//原先意义下的数据元素 private int priority;//优先级 public Element(){ } public El原创 2015-09-15 13:45:02 · 916 阅读 · 0 评论