
数据结构与算法
Xu_Cat
看过一些书,都忘了。
展开
-
JAVA实践Bellman-Ford最短路径距离算法
前言之前尝试过Dijkstra算法,用起来不错,想输出路径特别方便,但是有个问题,它不能解决负权边。 而今天的Bellman-Ford算法,就可以解决此问题。实现功能对带有负权的图求出两点之间的最短距离 输出实际路径中文版参考/** * Bellman-Ford算法,可解负权边 * 这个算法既有Floyd-Warshall算法的影子,又有Dijkstra算法的味道。 * * 其思想是遍历原创 2016-07-22 12:43:57 · 1921 阅读 · 0 评论 -
JAVA实践伪·漫水填充法
前言最近在看《啊哈,算法》,这是第四章第五节的内容。漫水填充法是个What?Windows的画图程序中有个油漆桶工具,其功能是用颜色填充一个封闭的区域。比如画了一个封闭的圈,使用油漆桶工具在圈内白色的区域点一下,整个圈里面就被填充成了默认的黑色。点击的那一刻,选中该位置的颜色作为种子颜色,将周围与种子颜色相近的点作为一个区域,然后填充该区域。PS下的魔棒也是同理,点击一个位置之后,将周围颜色相近的点原创 2016-07-18 21:45:18 · 936 阅读 · 0 评论 -
JAVA实践图的遍历
前言图是什么? 图可以长这样。 如果将图看作一个省份,每个顶点就是一座城市,连接的线则是道路,要判断这个省内有几个城市,就需要每个城市跑一遍,确认其是存在(连通)的,然后纳入计数。图在程序里如何表示图最常使用的存储方法是二维数组,上面那幅图,长这样。 * A1 B2 C3 D4 E5 * A1 0 1 1 ∞ 1 * B2 1原创 2016-07-19 15:34:06 · 1629 阅读 · 0 评论 -
JAVA实践图的存储结构---邻接表(利用链表)
前言关于邻接表,实现过一次数组版本的。 http://blog.youkuaiyun.com/xubaifu1997/article/details/51984760虽然会写了,也感觉略绕,所以尝试用了自带的链表对象粗暴的实现了。参考图来自:http://www.cnblogs.com/skywang12345/p/3707612.html 如上图,有7个顶点。我的实现思路非常粗暴,让每个顶点拥有一个链表。原创 2016-07-29 20:04:50 · 909 阅读 · 0 评论 -
JAVA实践优化Prim最小生成树算法
前言前一个版本实现的Prim算法使用邻接矩阵+遍历矩阵搜索顶点的Prim最小生成树算法http://blog.youkuaiyun.com/xubaifu1997/article/details/52037246然后偷懒没有优化,今天花了点时间,实现了《啊哈,算法》内提及的邻接表+最小堆的优化方法。没有经过严谨的测试,不排除有BUG(逃实现功能给定一个图,输出其最小生成树的长度参考/* 回顾一下Prim算法的思原创 2016-07-29 20:20:14 · 1106 阅读 · 0 评论 -
JAVA实践最小生成树-Prim算法
前言这个算法的普通版本时间复杂度是O(n^2),据说是可优化的。 邻接表+最小堆。然而我并没有去实现。 不过此未经优化的版本适合稠密图,Kruskal解决稀疏图,岂不美哉= = 好吧,我就是懒了实现功能实现最小生成树路径长度的计算中文版参考/** * Prim算法 * 同样假设所有顶点未连接 6 9 2 4 11 3 5 13 4 6原创 2016-07-26 16:41:30 · 1985 阅读 · 0 评论 -
JAVA实践分治法最大连续子序列求和
前言最大连续子序列求和是指给定一串数字,算出一段连续的数字能求得的最大和。实现功能给定一串数字3, -4, 2, 5, 9, -3, 7, 9求连续的子序列的最大和3, -4, [2, 5, 9, -3, 7, 9]最大连续子序列的和是29实现参考概括 * 拆分序列(直到只剩下一个数的序列) ----> 左序列|右序列 * 求左序列最大值 * 求右序列最大值 * 求跨边界的最大值 * 求原创 2016-07-19 23:16:55 · 1937 阅读 · 5 评论 -
JAVA实践非完美·在线处理算法求最大连续子序列和并输出首尾
前言来自PAT:https://pta.patest.cn/pta/test/16/exam/4/question/663Given a sequence of KK integers { N_1N1 , N_2N2 , ..., N_KNK }. A continuous subsequence is defined to be { N_iNi , N_{原创 2016-07-20 22:54:03 · 1151 阅读 · 0 评论 -
JAVA实践自平衡二叉树(AVL树)
前言平衡二叉树是二叉搜索树的一个变种,一棵完全偏向一边的搜索树在一定程度上会影响查找性能。 然而历史上总是不缺神,一些追求极致、完美(强迫症)的神就想出了平衡二叉树。本次仅实现插入、按层级展示两个功能。安利 此文很不错,特别是自带动画效果!! http://blog.youkuaiyun.com/eson_15/article/details/51144079这个简明扼要!!! http://www.c原创 2016-08-15 22:41:54 · 1739 阅读 · 0 评论 -
JAVA实践Dijkstra算法求最短路径距离
前言Dijkstra算法用于求指定顶点到其他顶点的最短距离,时间复杂度O(N^2),据说可以使用堆优化到O(log N),然而还不会。 其特点是(对我来说)非常容易求得路径,和对应的距离。 缺陷也是存在的,此算法不能处理负权边。即距离为负时,就挂了。 此文内容同样参考《啊哈,算法》另外个人感觉代码可能有错,还望有心人指点。功能实现输入一个顶点输出路径 输出与路径对应的距离 如果存在不可到达原创 2016-07-21 11:04:29 · 2263 阅读 · 0 评论 -
JAVA实践数组版图存储结构--邻接表
前言个人一开始感觉略绕,绕来绕去的,不知道其他人是怎样感觉的。直到我后知后觉的发现,其本质是用新的边编号分配位置存前一个编号,没有就给-1。 当然这只是我的个人理解。邻接表的好处是省空间啊,我粗暴的理解 当一个图是稀疏图,即 边数 < 顶点个数的平方 如10个顶点11条边,11条边远小于10^2 = 100. 使用邻接矩阵存储时,需要10*10的二维数组,粗暴的表示,就是100个变量。而使原创 2016-07-21 17:13:16 · 751 阅读 · 0 评论 -
JAVA实践基于DFS的图割点
前言思想大概明白,发现挺难写的。【重写了一遍】参考书籍:《啊哈,算法》 参考链接:http://www.cnblogs.com/en-heng/p/4002658.html不小心点进来的,推荐看以上链接。功能实现给定一个图,寻找其割点,并输出中文版参考新版本/** * * 图的割点算法: * 对顶点的访问次序进行记录形成时间戳 * 每到达一个顶点,就以该顶点的下一个顶点为起点进行遍历原创 2016-07-27 13:22:20 · 737 阅读 · 0 评论 -
JAVA实践归并排序
前言参考书籍: 《数据结构与算法分析·C语言描述》 《算法·第4版》归并排序只有两大难点,一是分,二是并。合并 static void merge(int[] a, int low, int mid, int high) { int i = low, j = mid + 1; for (int k = low; k <= high; k++) {原创 2016-09-02 16:53:28 · 466 阅读 · 0 评论 -
JAVA实践红黑树-小试牛刀
前言第一感觉是和AVL树差别不是特别大,没有很直观的感受到效率的巨大提升,作为一个小小的强迫症患者,还是AVL树更好看。不过讲道理,平衡被破坏次数相同情况下,红黑树的确少了那么一些旋转。。。因为插入节点后平衡被破坏时,红黑树的会选择旋转或变色。 AVL树则只有旋转。另外我发现其他的大神写法,跟我的有点差距。。。有心人可以帮我瞄一眼,我是不是哪里错了,在此先谢过了~~另外一个参考网站、博客、PDF:原创 2016-08-24 20:42:04 · 4994 阅读 · 1 评论 -
JAVA广度优先搜索---寻找从A点到B点最短路径
前言搜索界两大基础搜索算法分别是广度优先搜索和深度优先搜索。搜索算法可以用于寻找图的连通性。 一个普通的二维地图,从A点到B点,有两个问题。能否到达? 怎样以最短的路径走到B点?这是搜索算法能够解决的事情。要使用广度优先搜索算法来搜索从A点到B点的最短路径依据广度优先的原则,每走一步,都将下一步所有可能的选择入队之后,才进行下一步结束标记:队列为空时,搜索结束 搜索到指定结果时,搜索结束实原创 2016-07-18 15:53:14 · 7088 阅读 · 0 评论 -
JAVA实现单链表的增删改查
前言实现参考:http://blog.youkuaiyun.com/hitwhylz/article/details/12305021http://www.cnblogs.com/smyhvae/p/4761593.html建议阅读以上博客,我的博客更偏向于[我]能看懂 上面的博客则偏向于[大家]都能看懂实现的功能增加指定位置插入节点 在末尾增加节点 删除删除指定节点,通过节点数据(假设数据不重复)原创 2016-07-17 15:19:11 · 5033 阅读 · 0 评论 -
JAVA实践使用队列优化Bellman-Ford最短路径算法
前言本文内容参考《啊哈,算法》,算是前一个版本的后续。实现功能对不带环的图,不论是否存在负权,都可以寻找到其最短路径。 输出实际最短路径。中文版参考/** * 队列优化Bellman-Ford最短路径算法 * * 假设5个顶点7条边 * Bellman-Ford最短路径算法的核心代是对7条边进行4次的遍历 * 它不管你当前是否已经是最短路径 * 也不管这条边是否真的需要进行判断 *原创 2016-07-22 17:23:41 · 798 阅读 · 0 评论 -
数据结构-树-二叉树
树是什么?一种用于表示具有树状结构性质的数据结构。树的应用 操作系统中的文件目录,D盘是根、Android是D的子节点、sdk是Android的子节点公司的组织结构图家族的族谱树长啥样?树和图什么关系?树不包含回路,任意两点之间只有一条路径,树是一个不包含回路的无向图。下面就是包含回路的图,而不是树。 树任意两点之间只有一条路径一棵树如果有n个节点,那么其恰好有n-1条边在一棵树中加一条边原创 2016-07-23 13:51:46 · 894 阅读 · 0 评论 -
JAVA实践优先队列-最小堆
前言最小堆,以二叉树的形式存储数据,且所有的父节点均小于等于子节点。实现最小堆的创建存储 将一个普通二叉树结构的数组转为最小堆中文版参考/** * 优先队列-最小堆 * * 最小堆特征: * 所有的父节点都小于等于子节点 * 最小堆可解决的问题: * 寻找或插入最大最小元素,比起普通数组。无需遍历整个数组,提高效率 * * 对最小堆有两种操作,元素的上浮与下沉:原创 2016-07-23 17:01:10 · 1437 阅读 · 0 评论 -
JAVA实践堆排序
前言利用最小堆实现的排序,知道最小堆之后,原理非常简单。 然而使用数组实现最小堆排序时,因为无法移除元素,导致排序出现了错误。遂用数组链表实现,代码写的比较乱。感觉得到,写的非常恶心,放出来,也让有缘人感受一下。。。(⊙o⊙)…功能实现一组数,使用堆排序进行排序。 排序完成后输出参考/** * 堆排序的实现 * 堆排序原理: * 一个最小堆,其堆顶元素一定是最小的值。 *原创 2016-07-23 19:55:24 · 317 阅读 · 1 评论 -
JAVA实践并查集
前言并查集类似数学中的集合,如果是两个集合相交,那就把这两个集合合并成一个集合。 社交网络中推荐可能认识的人,可能是类似原理。 二狗子与B是好友{二狗子, B} B与A是好友{B,A}两个相交是B 所以合并,{二狗子,B,A}系统就可能会将B以可能认识的人给二狗子发现了不错的文章: 参考链接: http://blog.youkuaiyun.com/dm_vincent/article/details原创 2016-07-24 13:09:26 · 801 阅读 · 0 评论 -
素数计算---改良版埃氏筛选和欧拉筛选
埃氏筛选: 例如要找不超过100的所有素数。 需要建立一个大小为100加1个的布尔数组,称为isPrime。 已知0和1不是素数,所以,先找到第一个素数2,那么将其标记为素数。 isPrime[2] = true; 那么2的倍数肯定不是素数,使用建立的布尔数组对它们进行标记 isPrime[2*2] = false; isPrimer[2*3] = false; isPrimer[2转载 2016-07-11 16:16:56 · 897 阅读 · 0 评论 -
质因数分解的简单例子
思路: 构造出一个素数表。 将需要分解的数与从最小的素数开始判断,凡是能整除的,就进行除法运算,直到不能整除。 取下一个更大的素数,再次判断是否能整除,若可以,进行除法运算。效果360的质因数分解: 2*2*2*3*3*5=360实现/** * 质因数分解 * 输入一个数字,分解成素数相乘 */import java.util.*;public class PrimeFactor {原创 2016-07-11 17:00:21 · 2082 阅读 · 0 评论 -
求同余幂
同余幂应用于密码学,如b^n mod m,其中b, n, m都是非常大的整数,因此先求b^n是不可行的。 利用同余幂算法可解决这类指数巨大的求模运算。实现/** * 同余幂 * 求2^644 mod 645 * */import java.util.LinkedList;public class Congruence { public static void main(Strin原创 2016-07-11 21:24:45 · 896 阅读 · 0 评论 -
辗转相除法求最大公约数,附带求最小公倍数
辗转相除法: GCD(A, B) 1.由较大的数A对较小的数B取模得C 2.再用较小的数B对之前的模C取模 3.替换A的值为B,替换B的值为C 3.重复1,2,3直到C为0,A的值就是最大公约数最大公约数与最小公倍数的关系 A*B = 最大公约数 * 最小公倍数 最小公倍数 = A * B / 最大公约数/** * 辗转相除法求最大公约数 * 利用最大公约数和最小公倍数的关系求最小原创 2016-07-11 21:47:33 · 321 阅读 · 0 评论 -
字典序生成排列
比较粗暴,根据《离散数学及其应用》的伪代码直接写的。public class GeneratingPermutation { public static void main(String[] args) { System.out.println(genPerm("123")); System.out.println(genPerm("243541"));原创 2016-07-13 09:33:24 · 958 阅读 · 1 评论 -
JAVA实践最小生成树---kruskal算法
前言最小生成树的个人理解: 整条路径没有环,同时任意两点只有一条路 顶点与边数的关系是 边数 = 顶点数 - 1 路径最短最小生成树的用途比较实际,比如如何以最短的路径走8个地方一遍,且不重复。 而Kruskal算法就可以解决此问题。实现功能基于Kruskal算法实现对现有的无向图生成最小树 并计算整条路径的长度输出中文版参考/** * 最原创 2016-07-25 15:23:26 · 624 阅读 · 0 评论 -
JAVA实现快速排序
简易思路:以一个数为标准,称为[基准数] 小于基准数的放左边 大于基准数的放右边 将其定为[移动规则]移动之前[3] 2 5 6 7 1 4开始移动[[3]] 2 5 6 7 [3] 4以[3]为基准书,则经过第一次移动之后1 2 [[3]] 6 7 5 4第一次移动完成之后,再以基准数为边界将其切割{1, 2} [3] {6, 7, 5, 4},再分别对{1, 2},原创 2016-07-16 08:08:27 · 410 阅读 · 0 评论 -
JAVA使用数组简单模拟队列
前言模拟的非常简单,简单到只是大概体现其思想。 高端的队列实现我也不会(逃关于队列队列是什么? 生活中很简单的一个例子,排队。 就说买电影票,先去的人,先买到票。后来的人,在后面排队等待。 程序中的例子,迅雷下载。 下载各种.avi时,如果有15个以上的任务需要下载,假设指定5个同时下载,那么剩下的十个就是在队列里等待,先下载的先完成。队列就是这样一个“先进先出”、”后进后出”的数据结构。原创 2016-07-16 10:57:11 · 1064 阅读 · 0 评论 -
“让我怎能过大年”参考解法--很暴力
前言这是一个暴力解法,时间之长,令人发指。 Q:有如上的加法算式。其中每个汉字代表一个数字。请填写“让我怎能过大年” 所代表的整数。所有数字连在一起,中间不要空格。例如:"3125697"。当然,这个不是正确的答案。注意:只填写一个整数,不要填写任何多余的内容。正常解法参考正常的解法,经过我的窥探,是对7位数字直接取模得到7个数字,然后依次算出1. 7个数字之间相关的和原创 2016-08-12 19:48:08 · 1697 阅读 · 0 评论