java算法
文章平均质量分 90
guanhang89
这个作者很懒,什么都没留下…
展开
-
自带类库StdRandom
uniform public static int uniform(int n) { if (n <= 0) throw new IllegalArgumentException("Parameter N must be positive"); return random.nextInt(n); } public static int unifo原创 2016-03-01 21:17:23 · 3516 阅读 · 0 评论 -
十、查找算法(Map的实现以及对比)
查找符号表部分API有序符号表的实现应用基于无序链表中的顺序查找实现基于有序数组中的二分查找实现核心问题以及各种Map实现方法优缺点查找这里使用符号表这个词来描述一张抽象的表格,我们会将信息存储在其中(值),然后按照指定的键来搜索并获取这些信息。符号表有时也被称为字典或者索引(说白了就是Map)符号表部分API实现的注意事项: 每个键只对应着一个值; 当插入键值重复时,覆盖旧值;原创 2016-03-16 23:45:59 · 3734 阅读 · 0 评论 -
十四、符号表Map(Set)的应用
应用选择哪种实现各种实现性能比较: 一般会在散列表和二叉查找树中选择(包括红黑树)。散列表查找更快,红黑树可以保证查找和插入的最坏性能,并且是有序的。一般第一选择是散列表Java标准库中,TreeMap是基于红黑树实现的,HashMap是基于拉夫链法的符号表实现的Map到Set的实现:忽略Map中的值或者使用一个简单的类进行封装,就可以将任何一个Map变成Set。实际上Java标准库的Set(Tr原创 2016-04-16 23:22:59 · 686 阅读 · 0 评论 -
十五、图的算法之无向图
无向图定义:图是由一组顶点和一组能够将两个顶点相连的边组成的。特殊的图:有自环:与自己相连有平行边:也称为多重图相关术语: 大多数我们会省略“简单”二字 图的密度:已连接顶点对占未连接的比例无向图数据类型常见的存储方式:(邻接集是采用Set存储,以方便去重以及删除顶点) 代码(内部使用了背包,也就是链表)public class Graph { private static原创 2016-04-17 18:10:42 · 5995 阅读 · 0 评论 -
十六、图算法之有向图
有向图有向图的数据结构采用链表public class Digraph { private static final String NEWLINE = System.getProperty("line.separator"); private final int V; // number of vertices in this digraph privat原创 2016-04-18 00:07:09 · 6405 阅读 · 0 评论 -
十三、散列表(哈希表)
散列表散列表查找分两步: 1. 根据散列函数找到索引 2. 处理索引冲突情况:拉链法和线性探测法散列表示时间上和空间上作出权衡的例子。没有内存限制我们可以直接将一个超大数组作为符号表,但是键很多时会导致需要的内存很大。 散列表采用函数映射,查找很快,但是键的顺序信息不会保存散列函数对于每种类型的键我们都学要一个与之对应的散列函数 正整数: 常用取余散列:k%M 浮点数: 例如0-1之间原创 2016-04-16 22:39:52 · 6484 阅读 · 0 评论 -
十七、图算法之最小生成树
#最小生成树 说白了就是连接所有点的然后权值最小的无环连通子图主要有两种算法:Prim算法和Kruskal算法先做一些约定:只考虑连通图(不连通你分开算就行了)边的权重不一定是表示距离边的权重可能是0或者负数(无环,负数就不影响)所有边的权重都各不相同(造成最小生成树不唯一)原理回顾树的重要性质:用一条边连接树中的任意两个顶点都会产生一个新的环从树中删除一条边将会得到两个独立地树切原创 2016-04-18 22:08:47 · 1550 阅读 · 0 评论 -
十八、图算法之最短路径
最短路径加权有向图的数据结构Dijstra算法有向无负边无环加权有向图中的最短路径算法无环加权有向图中的最长路径算法一个应用平行任务调度优先级限制下的平行任务调度相对最后期限下的并行任务调度一般有向加权图的最短路径问题基于队列的Bellman-Ford算法套汇最短路径这里基于的是加权有向图的讨论,而且是单源最短路径问题。我们称为最短路径的结果是一棵最短路径树。给定一幅加权有向图和原创 2016-04-19 00:21:16 · 3554 阅读 · 0 评论 -
七、快速排序
快速排序快速排序引人注目的特点包括它是原地排序(只需要一个很小的辅助栈),且将长度为N的数组排序所需的时间和NlogN成正比。之前的算法都无法结合这两个优点。 另外快速排序的内循环比大多数排序算法都要短小,这意味着它无论是在理论上还是在实际中都要更快。缺点是有可能会导致平方级别基本算法快速排序是一种分治的排序算法。它将一个数组分成两个数组,将两部分独立地排序。快速排序和归并排序是互补的;归并排序将原创 2016-03-09 12:53:41 · 608 阅读 · 0 评论 -
王道部分笔记
分治法求用1*2的瓷砖覆盖2*M的地板有几种方式第一块瓷砖放的方式不同,导致: F(M) = F(M-1) + F(M-2) 其中F(1) = 1;F(2) = 2 解决递推中重复计算的问题: 备忘录法: 用一个数组记录 动态规划算法通常用于最优化问题。动态规划算法的思想与分治算法类似,也是通过组合子问题的解而解决整个问题的,与分治算法的不同的是,动态规划分解得到的子原创 2016-07-14 16:48:09 · 513 阅读 · 0 评论 -
剑指Offer java代码
在牛客网上通过的代码数组查找/**在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 * 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 * Created by guanhang on 2016/7/14. */public class Solution1 { public boolean Find(int []原创 2016-07-16 01:24:50 · 378 阅读 · 0 评论 -
十大排序算法 JAVA代码
冒泡排序插入排序选择排序希尔排序归并排序快速排序堆排序计数排序基数排序桶排序参考了这篇博客总体总结表:这个有个错误就是归并排序需要一个o(n)的辅助数组 冒泡排序主要思想:外层循环从1到n-1,内循环从当前外层的元素的下一个位置开始,依次和外层的元素比较,出现逆序就交换。 特点:stable sort(稳定性排序)、In-place sort(不占用额外的空间,只是交换元素)原创 2016-07-13 23:10:17 · 11200 阅读 · 4 评论 -
十二、平衡二叉树(2-3查找树、红黑二叉树)
平衡二叉树2-3查找树保证平衡红黑二叉树旋转向2结点中插入新键向树底部的2-结点插入新键向3结点插入新键向树底部的3-结点插入新键红链接的传递删除最小键构造轨迹性质平衡二叉树理想情况下,我们希望能够保持二叉查找树的平衡性,总是希望树高~lgN。2-3查找树(保证平衡)为了保证查找树的平衡性,我们需要一些灵活性,因此在这里我们允许树中的一个节点保存多个键。确切地说,我们将一颗标准原创 2016-04-01 21:41:43 · 3144 阅读 · 0 评论 -
十九、字符串排序算法
字母表类一些应用程序可能对字符串的字母表作出限制。在这些应用中,可能常常需要会需要一个API来表示Alphabet类(只是参考,并不会使用该类讨论算法) public class Alphabet { /** * The binary alphabet { 0, 1 }. */ public static final Alphabet BINARY = new原创 2016-04-25 10:50:17 · 3712 阅读 · 0 评论 -
九、排序算法的应用(找中位数、重复统计、Kendall tau距离等)
应用将各种数据排序该使用哪种排序算法问题的归约找出数组中重复元素排名优先队列中位数与顺序统计应用将各种数据排序注意:想在忽略大小写的情况下比较字符串进行排序,可以使用Java类型中定义的CASE_INSENSITIVE比较器,例如:Insertion.sort(a, String.CASE_INSENSITIVE_ORDER)排序的稳定性:如果一个排序算法能够保留数组中重复元素的相原创 2016-03-16 04:05:48 · 2050 阅读 · 0 评论 -
一、算法第四版(二分查找、背包、队列、栈)
[toc] 整理自算法 第四版 算法第四版code以及DATA 自带库下载基础部分二分查找/* * 从文件读取int数组 * 从控制台输入一个数,如果不在数组里面就打印在控制台 */package edu.princeton.cs.algs4;import java.util.Arrays;public class BinarySearch { private Binary原创 2016-02-17 11:16:17 · 1715 阅读 · 0 评论 -
二、LinkedQueue、LinkedStack
LinkedQueue相对于之前的Queue带有check()package queue;import java.util.Iterator;import java.util.NoSuchElementException;import edu.princeton.cs.introcs.StdIn;import edu.princeton.cs.introcs.StdOut;public c原创 2016-03-01 19:37:31 · 625 阅读 · 0 评论 -
算法四自带类库源码(In)
In类学习学习,正好适合初学者In类import java.io.BufferedInputStream;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.net.Socket;// import java.net.HttpUR原创 2016-02-20 18:41:13 · 1524 阅读 · 1 评论 -
五、排序算法(选择排序、插入排序、希尔排序)
排序初级排序算法通用API: less():比较 exch():交换 show():输出 sort:排序 为了验证是不是成功,加上 assert isSorted(a) 成本模型: 在研究排序算法时,我们需要计算比较和交换的数量,对于不交换元素的算法,会计算访问数组的次数选择排序找到最小的元素,和第一个交换,再在剩下的元素中找到最小的元素,与第二个交换,一次进行下去。 代码(含有多个重载方原创 2016-03-06 15:03:18 · 619 阅读 · 0 评论 -
三、算法分析(three-sum算法)
算法分析计时类设计public class Stopwatch { private final long start; public Stopwatch() { start = System.currentTimeMillis(); } public double elapsedTime() { long now = System.c原创 2016-03-01 20:42:19 · 7885 阅读 · 0 评论 -
六、归并排序
归并排序要将一个数组排序,可以先(递归的)将它分成层两半分别排序,然后将结果归并起来。 它能保证任意长度为N的数组排序所需时间和NlogN成正比;它的缺点则是它所需的额外空间和N成正比。 原地归并的抽象方法实现归并的一种直截了当的办法是将两个不同的有序数组归并到第三个数组中,两个数组中的元素应该都实现了Comparable借口。实现的方法很简单,创建一个适当大小的数组然后将两个输入数组的元素从一原创 2016-03-09 00:11:10 · 756 阅读 · 0 评论 -
十一、二叉查找(排序)树(符号表的实现)
二叉查找树基本实现部分讲解分析跟有序性有关的API解释性能分析二叉查找树能够将链表插入的灵活性和有序数组查找的高效性结合起来的符号表实现(链表)。具体来说,就是使用每个结点含有两个链接的二叉查找树来高效地实现符号表。定义一些术语:数据结构由结点组成,结点包含的链接可以指向空或者其他结点。在二叉树中,每个结点只能有一个父节点(根结点例外),每个结点只有左右两个链接,分别指向左子节点和右子节点。原创 2016-03-18 23:37:10 · 1155 阅读 · 0 评论 -
八大排序算法图示
详见:这里转载 2016-03-09 18:27:20 · 598 阅读 · 0 评论 -
Transaction类
源代码:public class Transaction implements Comparable<Transaction> { private final String who; // customer private final Date when; // date private final double amount; // amou原创 2016-03-09 23:25:29 · 1784 阅读 · 0 评论 -
四、union-find算法
union-find算法动态连通性问题: 设计一个数据结构来保存程序已知的所有整数对的足够多的信息,并用它们来判断一个新对象是否相连。这个问题也称为动态连通性问题可能的应用:网络(计算机之间的连接)变量名的等价性数学集合这里使用网络方面的术语,将对象称为融点,将整数对称为连接,将等价类称为连通分量 或者简称分量。假设用0到N-1的整数表示N个融点代码定义的API : 最终代码:pub原创 2016-03-04 14:18:35 · 2154 阅读 · 1 评论 -
八、优先队列、堆排序
优先队列API初级实现堆得定义堆的算法索引优先队列索引优先队列的使用案例堆排序优先队列一种常见的数据结构,需要支持两种操作:删除最大(最小)元素和插入元素。这种数据类型叫做优先队列。APIMaxPQ()//创建一个优先队列MaxPQ(int max)//创建一个最大容量为max的优先队列MaxPQ(key[] a)//用a[]中的元素创建一个优先队列void Insert()//原创 2016-03-09 23:23:47 · 1605 阅读 · 0 评论 -
面试:递归和非递归方式实现先序、中序、后序遍历代码
public class TreeTraversal { public void preOrderRecur(Node head) { if (head == null) { return; } System.out.println(head.value + ""); preOrderRecur(head.原创 2016-08-01 15:41:57 · 405 阅读 · 0 评论