![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
algorithms
数据结构与算法学习
往者之不谏
剑未配好,出门便是江湖
展开
-
union-find算法
首先我们详细的说明以下问题:问题的输入是一列整数对,其中每个整数都表示一个某种类型的对象,一对整数p,q可以理解为“p和q是相连的”。我们假设“相连”是一种等价关系,这也就意味着它具有: 1.自反性:p和p是相连的。 2.对称性:如果p和q是相连的那么q和p也是相连的。 3.传递性:如果p和q是相连的且q和r是相连的,那么p和r也是相连的。 列子:输入的整数表示一个大型计算机网络中的计算机...原创 2018-08-09 23:13:55 · 168 阅读 · 0 评论 -
letcode 搜索二维矩阵 II
题目描述:编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],...原创 2019-03-01 22:50:11 · 160 阅读 · 0 评论 -
无向图的广度优先遍历
无向图的广度优先遍历通过队列来实现,广度优先队列可以用来实现查找最短路径,也就是距离两个点之间边最少的路径,先让顶点进队列,然后出队列,把和顶点相连通的点入队列,借助队列的先入先出特性来实现广度优先遍历。寻找路径的API如下:(Graph 请看前面无向图的邻接表实现) BreadthFirstPaths(Graph G, int s) 在G中...原创 2018-08-25 23:14:39 · 4057 阅读 · 0 评论 -
无向图的深度优先搜索
无向图的深度优先搜索简单易懂,通过栈实现,需要一个图,图的实现请看上篇,使用一个数组来标记图中的节点是否被遍历过,从顶点开始遍历,每次找到与节点相连的节点遍历。具体实现如下: API DepthFirstSearch(Graph G, int s) 找到和起点s连通的所有顶点\ ...原创 2018-08-25 22:48:09 · 856 阅读 · 0 评论 -
无向图邻接表实现
图是由一组顶点和一组能够将两个顶点相连的边组成,使用邻接表来组建,即使用一个背包数组来实现。节点由0带V-1组成,节点数为V,边数为E. API: public class Graph Graph(int V) 创建一个含有V个顶点但不含边的无向图 int V() ...原创 2018-08-25 22:26:26 · 2888 阅读 · 0 评论 -
有向图中的可达性(深度优先)
使用深度优先搜索来解决有向图中节点的可达性问题,分为单点可达性和多点可达性。DiGraph为有向图结构,请参考上篇《邻接表的有向图》实现 单点可达:给定一副有向图和一个起点s,求是否存在一条从s到v的路径。 多点可达:给定一幅有向图和一个节点的集合,求是否存在一条从集合中的任意顶点到给定顶点的有向路径。 有向图的可达性API: public class DirectedDFS ...原创 2018-08-26 12:26:06 · 2348 阅读 · 0 评论 -
邻接表的有向图结构
有向图的定义和无向图基本相同:一幅有方向性的图是由一组节点和一组有方向的边组成的,每条有方向的边都连接着有序的一对顶点。有向图的数据类型如下: public class Digraph Digraph(int V) 创建一个V个节点0条边的有向图 int ...原创 2018-08-26 11:52:42 · 1375 阅读 · 2 评论 -
队列的链表实现
基于链表的数据结构实现队列也很简单,它将队列表示为一条从最早插入的元素到最近插入的元素的链表,实例变量first指向队列的头,实例变量last指向队列的尾。要将一个元素出列就删除表头节点。入列就在表尾节点后新增一个节点。 Queue的API public boolean isEmpty() //判断队列是否为空队列 public int size() ...原创 2018-08-08 21:46:03 · 413 阅读 · 0 评论 -
链表实现栈结构
本文来详细介绍栈结构的链表实现,链表:一种递归的数据结构它或者为空(null),或者是指向一个结点(node)的引用,该节点包含一个泛型的元素和一个指向另一条链表的引用。链表实现栈结构最大的优势就是插入,删除方便,并且不必考虑扩容问题。 节点记录:public class Node{ Item item; Node next;}栈的API: public ...原创 2018-08-08 21:24:29 · 535 阅读 · 0 评论 -
数组实现简单的栈结构
栈最大的特点就是先入后出,先看一下简单的API public int size() //返回栈中数据个数 public void push(Item item) //进栈 public Item pop() //出栈 public boolean isEmpty() //是否为空 自定义的栈要实现迭代器功能 实现 Iterable接口,需要存储所有的结构所以使用泛型。具体代码实现...原创 2018-08-08 20:54:35 · 302 阅读 · 0 评论 -
快速排序
快速排序是一种很长用的排序方法,它的基本原理就是从一组数中找出一个数,使这个数的左边都是小于这个数的,这个数的右边都是大于这个数的,通过这个数把数组分为两份,以此类推可以得到一个升序排列的数组。 代码实现:public class Quick{ public static void sort(Comparable[] a){ sort(a,0,a.length-1...原创 2018-08-12 18:28:19 · 79 阅读 · 0 评论 -
自底向上的归并排序
自底向上的归并排序和自顶向下的归并排序差不多,基本思想都是利用分治。需要注意的是管理好每次排序的lo,mid.hi的值 具体实现:public class Merge{ private Comparable[] aux; //排序 public static void sort(Comparable[] a){ aux = new Comparable...原创 2018-08-12 15:16:33 · 201 阅读 · 0 评论 -
自顶向下的归并排序
归并排序,要将一个数组排序,可以先将它分成两半分别排序,然后将结构归并起来。具体实现如下public class Merge{ private Comparable[] aux;//辅助数组 public static void sort(Comparable[] a){ aux = new Comparable[a.length]; s...原创 2018-08-12 14:43:11 · 246 阅读 · 0 评论 -
希尔排序
对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组的一端移到另一端。例如,如果主键最小的元素在数组的尽头,要将它移到正确的位置就需要N-1次移动。希尔排序为了加快速度简单的改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。 具体实现:public class Shell{ //将a按升序排列 ...原创 2018-08-12 14:00:30 · 88 阅读 · 0 评论 -
插入排序
插入排序也是一种基本的排序算法,当前索引左边的元素都是有序的,但它们的最终位置还不确定,为了给更小的元素腾出空间,它们可能随时移动。但当索引到达数组的右端时,数组排序就完成了。 代码实现public class Inserted{ //插入排序的实现 public static void sort(Comparable [] a){ for(int...原创 2018-08-11 18:19:06 · 120 阅读 · 0 评论 -
选择排序
选择排序是一种基本的排序算法,它每次选出最小的值放到数组的前面,比较简单,API如下 public void sort(Comparable[] a) //对a进行从小到大的排序 public void exch(Comparable[] a,int i, int j) //交换i和j的位置 public boolean less(Comparable p,Comp...原创 2018-08-11 18:05:37 · 89 阅读 · 0 评论 -
union-find算法改善(二)
使用上一篇的使用来实现union-find算法,即用一个辅助数组来记录分量的权,每次都让权小的分量合并到权大的分量上,这样可以有效的保障算法再任何情况下的执行效率,每次union()都把分量小的合并到分量大的分量上。这样我们构造出来的树结构的层数就会减小。 代码实现:public class UF(){ private int[] a; private int[] sz; ...原创 2018-08-11 17:45:41 · 84 阅读 · 0 评论 -
union-find算法改善(一)
在上一篇的union-find算法中,每次执行union()方法都要遍历一次数组,造成很大的时间消耗,那么,有没有一种方法来改善union()方法呢,提供一条思路。我们采用链式结构来存储数据,即属于一个分量的数据保存到一条链中,比如1,3,5属于一条链,那么,我们把数组存储为a[1] = 3 a[3] =5 a[5] =5,这样可以减少union()将不用遍历数组,只用找到一个分量的根节点,再用根...原创 2018-08-11 17:30:31 · 177 阅读 · 0 评论 -
二分查找
二分查找是一种对有序数组的一种很快的查找方式,用二分查找去查找一个n长度的数组最多需要logn步,它是每次从数组的中间开始查找,每次排除一半的数。二分查找的流程如下:具体代码实现:public static int binary_search(int[] nums,int item){ int lo = 0; int hi = nums.length-1;...原创 2019-03-04 09:36:47 · 158 阅读 · 0 评论