算法
扫雪去
哈哈哈
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Floyd算法
Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。步骤如下:加权图 G,边的距离dis[][], 前驱节点记录path[][]1:遍历 G 的节点 n1 ,尝试 是否满足 存在两个节点 a,b 使: [a->b] > [a->n1->b], 如果存在那么 修改 dis[a][b] = dis[a][n1]+dis[n原创 2017-02-24 14:31:35 · 349 阅读 · 0 评论 -
a*入门
http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx转载 2017-02-23 18:11:33 · 415 阅读 · 0 评论 -
AVL 树 学习概要
一、AVL 树是什么?AVL是一种自平衡的二叉查找树,最大的特点是AVL树任意两个节点的高度差最大为1。什么?你问我二叉查找树是啥?拉黑吧有事漂流瓶联系吧。。。那么请你先去看看什么是二叉查找树在来看AVL吧。二、怎么实现的?当然实在二叉树插入或删除数据的时候进行一些 平衡 操作啦。在AVL树中插入或删除一个节点,使得二叉树失去平衡分为四种状态。(图片来自参考内容)1原创 2017-03-13 13:54:53 · 311 阅读 · 0 评论 -
KMP
kmp字符串是匹配算法。利用一个next数组大大缩短每次子串对原串的遍历次数。next数组实际保存的就是子串的自我覆盖程度。子串当前位置前有n位数与从头开始到n位数相同,这样当前位置错误判断就可以到n位匹配而不是直接到0匹配。private int[] createNext(char[] str){ int[] next = new int[str.length]; next[原创 2017-02-17 15:58:12 · 294 阅读 · 0 评论 -
选择排序
时间复杂度: 算法稳定性:不稳定步骤:在排序过程中整个数组 E 分为两个部分,第一部分已排序序列 A(在数组前端开始,初始为空),第二部分是未排序列 B( B=E-A)。1:遍历 B ,在 B 中找到最小的元素 min。2:将 B 中开头元素 start 与 min 交换位置,并将 min 加入到 A 中。3:循环 1,2 直到 B 中为空。没有图!注:原创 2017-02-17 11:09:10 · 240 阅读 · 0 评论 -
基数排序
基数排序一种基于多关键字的排序。对多关键字进行多次排序,但是排序算法要是稳定的,否则结果会发生不可预估的错误。如:对数字排序,先对个位排序,在对十位进行排序。。。并且可以用桶排序对每个关键字装桶。例子:@Override public int[] sort(int[] source) { int max = source[SortUtils.maxIndex(source)];原创 2017-02-17 14:34:50 · 342 阅读 · 0 评论 -
计数排序
计数排序有一个source数组,一个count数组,一个sorted数组,count数组是可以表示source最小数 min 到最大数 max 的范围。遍历source在count中记录对应数出现的次数。count[souce[i] - min]++将count数据转换为对应数据应该出现的位置。count[i] += count[i - 1]遍历source并在count获取排序位原创 2017-02-17 14:21:05 · 336 阅读 · 0 评论 -
桶排序
桶排序不是基于比较的排序算法,最快的效率可以达到 O(n)。但是是很费空间的一种排序算法。将数据按一定原则分桶,如 10,29,18,38 按 n/10分桶,那么可分为 0:[], 1:[10,18], 2:[29], 3:[38] 四桶。然后在对桶中的数据单独排序(如在新增数据的时候作插入排序),极限情况下,一个桶中只有一个数据那么时间复杂度就是O(n)了。原创 2017-02-17 14:16:28 · 394 阅读 · 0 评论 -
快速排序
时间复杂度:O(n*log2n)算法稳定性:不稳定原理:1:首先在数组中选取一个参照点 T。2:将数组调整为 T 左边所有点Tl小于 T, T 右边所有点Tr 大于等于T。3:递归的对 Tl 和 Tr 执行 1,2,3步骤知道不能再分。没有图!注:本系列算法是用于记录自己学习算法阶段对每个算法的自己理解。原创 2017-02-17 14:04:51 · 256 阅读 · 0 评论 -
堆排序
时间复杂度:O(n*log2n) 算法稳定性:不稳定原理:利用大根堆进行排序。步骤:整个排序过程中整个数组 E 分为两部分:有一个大根堆区 A(初始为整个数组), 和一个 已排序队列 B(B=E-A,初始为空)。主要步骤分为构建大根堆和排序两部分。--声明 新入节点堆调整步骤 ----trim:新入节点 new原创 2017-02-17 13:57:01 · 335 阅读 · 0 评论 -
归并排序
时间复杂度:O(n log n) 算法稳定性:稳定原理:将两个有序数组归并为一个有序数组。(元素数量为 1 时也是有序数组哦)步骤:整个排序过程中有一个原数组 S ,有一个临时数组 T。分为两个步骤分割和归并。1:将数组递归的从中间分割为两个子序列,直到不可在分(即子序列元素数量小于 1 )。然后利用 T 对两个子序列进行归并, 在将 T 中数据复制到 S。原创 2017-02-17 11:28:36 · 217 阅读 · 0 评论 -
最优二叉树
最优二叉树又叫huffman树。在此直接介绍构造树的方法。构造过程中有一个节点数组 nodes1:从 nodes 中获取权值最小的两个 node。2:将两个 node 组成一个树父节点 nRoot 权值为两个 node 权值之和,从 nodes 中删除两个 node 并将 nRoot 添加到 nodes 中。直到 nodes 中只剩余一个节点。那么huffman tree构造完原创 2017-02-17 14:42:49 · 1205 阅读 · 0 评论 -
Dijkstra
Dijkstra图的最短路径算法。搜索过程中有 一个搜索过的节点 used ,一个 起始点到各点的最短距离distance, 一个前驱节点表 prev 用来标识这个节点在distance存储的距离的前驱节点,最后用于生成最短路径。1:将 start 放入 used ,从起始点 start 遍历周边节点,将可到达的节点的距离放入 distance ,并将 prev 中的对应节点的前驱设置为原创 2017-02-17 16:35:13 · 319 阅读 · 0 评论 -
a*
a*算法是搜索最短路径的算法(曼哈顿距离)。你要记住一个公式 F=G(从起点到该放个的当前最小消耗)+H(预估到终点距离)整个搜索过程中有:graph[][]搜索地图, used搜索过的节点集合,waiting 等待搜索的节点集合。起始点 start,终点 end1:将 start 放入 waiting2:从 waiting 中取出 F 最小并且不在 used 中的节点为当原创 2017-02-17 16:54:47 · 278 阅读 · 0 评论 -
prim
最小生成树prim算法:graph[][] 待生成树的图,used[] 使用过的节点,distance[] 生成树到各节点的最短距离,start 任意起始点。1:将 start 放入 used ,从起始点 start 遍历周边节点,将可到达的节点的距离放入 distance 。public static void init(int[][] graph, boolean[]原创 2017-02-17 17:14:50 · 355 阅读 · 0 评论 -
kruskal
最小生成树算法-kruskal:graph[][] 图lines[] 图的所有边nodes[] 所有节点(初始值所有节点,每个节点的父子均为空)static class Line{ public Line(int from, int to, int weight){ this.from = from; this.to = to; this.weight = w原创 2017-02-17 17:26:39 · 547 阅读 · 0 评论 -
冒泡排序
时间复杂度: 算法稳定性:稳定(如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的)步骤:在排序过程中整个序列分为两个部分,第一部分未排序部分 A(初始时是整个待排序列),第二部分是已排序列 B(初始时是空的)。1:比较 A 的相邻元素,如果第一个元素大于第二个元素那么交换两个元素位置。2:循环执行 1 ,直到比较完整个 A。此时 A 中最后一个元素就是 A 最大原创 2017-02-17 10:22:18 · 209 阅读 · 0 评论
分享