随笔分类 -  算法

摘要:弗洛伊德算法和迪杰斯特拉算法类似,是计算一个图中各个顶点之间的最短路径,每一个顶点都是出发顶点 记录两个顶点的距离,如果有经过某一顶点所得到的距离比直接连接这两个顶点的距离小则更新,否则不变 实现为:使用双层循环当中间顶点不变,出发和终点的点进行循环,最后使用一层循环更新中间顶点,总共使用三层循环, 阅读全文
posted @ 2020-02-28 11:10 Axs 阅读(256) 评论(0) 推荐(0)
摘要:迪杰斯特拉算法是求最短路径的算法,计算图中一个顶点到其他顶点的最短路径,应用了广度优先的思想,由一个点扩散直到终点为止 过程: 设置出发顶点为v,集合为V,距离集合为Dis 从Dis中选取最小值移除di,同时移除对应的V的顶点vi 比较v到V中顶点的距离值,与v通过的vi到集合V中顶点的距离值,保留 阅读全文
posted @ 2020-02-28 10:47 Axs 阅读(386) 评论(0) 推荐(0)
摘要:同样是求最小生成树克鲁斯卡尔算法的思想则转变了一下,以边为目标去生成最小数 这种感觉就像是结果等于10式子2*5也行,20/2也行,方式不同只看最后的结果 思想:按照权值的大小从小到大排序,选择n-1条边,并且不构成回路 过程:构造一个只含有n个节点的森林,然后从权值最小到最大选择边加入到森林中,使 阅读全文
posted @ 2020-02-27 11:37 Axs 阅读(841) 评论(0) 推荐(0)
摘要:普里姆算法的应用场景为修路问题,就是用最小的路径连接所有节点 转换一下就是最小生成树(MST)的问题:给定一个带权的无向连接图,如何选取一颗生成树,使树上的所有的边上权的总和为最小,就是最小生成树 普里姆算法求最小生成树:在包含n个顶点的连接图中,找出只有(n-1)条边并包含所有n个顶点的连通子图, 阅读全文
posted @ 2020-02-27 11:18 Axs 阅读(530) 评论(0) 推荐(0)
摘要:骑士周游问题实际上是图的深度优先搜索(DFS)的应用,使用回溯的方式来解决步骤过于繁琐,一旦走错就要回溯 为了减少运算次数,使用贪心算法进行优化:根据当前一步的所有的下一步的选择位置进行递减排序 减少回溯次数 import java.awt.*; import java.util.ArrayList 阅读全文
posted @ 2020-02-26 11:54 Axs 阅读(612) 评论(0) 推荐(1)
摘要:贪心算法是指对于解决问题的每一步都作出最优解,从而希望得到最后的结果也是最优解,但是最后结果不一定都是最优解,大部分都是最接近最优解的结果 具体在百度百科的基本思路里有很好的解释,这里就不详写了 用贪心算法解决覆盖问题: import java.util.ArrayList; import java 阅读全文
posted @ 2020-02-26 11:50 Axs 阅读(170) 评论(0) 推荐(0)
摘要:暴力匹配算法虽然写起来简单但是效率太低了,一旦出现不匹配就要从头匹配,怎么能让字符串匹配不对的时候有效的往后移动呢?这时候就出现3个大神,分别提出最后联合发表了这个算法——KMP算法,有效的解决了这个问题。 KMP算法的核心就是如何有效的后移,这张表的计算方法如下 如字符串:A B C D A B 阅读全文
posted @ 2020-02-25 11:01 Axs 阅读(127) 评论(0) 推荐(0)
摘要:暴力匹配的方式很简单,就是一个个的对比,当有一个不对的时候则将要找的数据从头计算,被找的数据继续往下寻找,直到被找数据对比完成,找到返回下标,没有返回 -1 public class ViolenceMatch { public static void main(String[] args) { S 阅读全文
posted @ 2020-02-25 10:27 Axs 阅读(706) 评论(0) 推荐(0)
摘要:动态规划算法和分治算法类似,不同在于分解为子问题并不是互相独立的,而是一步步逼近最终答案 动态规划可以通过填表的方式逐步推进,而动态规划算法最佳实现就是背包问题 背包问题就是最大,最小价值的问题,即怎么买(装,放)可以达到最大,最小价值 public class KnapsackProblem { 阅读全文
posted @ 2020-02-25 10:21 Axs 阅读(274) 评论(0) 推荐(0)
摘要:分治算法的核心是把一个大的问题分解成若干个小问题,互相独立,与原问题形式相同的子问题,若小问题规模较小则直接解决,否则递归解决各个小问题,然后将各个子问题的解合并为原问题的解 像快速排序,归并排序等问题都用到了分治算法思想,其中比较著名的问题是解决汉诺塔 public class Hanoitowe 阅读全文
posted @ 2020-02-24 10:28 Axs 阅读(189) 评论(0) 推荐(0)
摘要:public class BinarySearchNoRecur { public static void main(String[] args) { int[] arr = {1, 3, 8, 10, 11, 67, 100}; System.out.println(binarySearch(ar 阅读全文
posted @ 2020-02-24 10:19 Axs 阅读(220) 评论(0) 推荐(0)
摘要:堆排序属于不稳定排序,时间复杂度为O(nlogn),是利用堆这种数据结构设计的排序算法,是一种选择排序 堆是一个近似完全二叉树的结构,每个节点值都大于或等于左右节点为大顶堆,小于等于为小顶堆 升序排序大顶堆,降序排序小顶堆 思想和方法:将原始数据构 n 造成大顶堆,此时最大值为根节点,然后与末尾的原 阅读全文
posted @ 2020-02-11 13:35 Axs 阅读(136) 评论(0) 推荐(0)
摘要:斐波那契查找是属于二分查找的一种,提高了查找效率 查找方式在百度词条中已经说的很清楚了这里就不再写了,直接走代码,体验一下0.618的神奇 import java.util.Arrays; public class FibonacciSearch { public static int maxSiz 阅读全文
posted @ 2020-02-08 11:54 Axs 阅读(194) 评论(0) 推荐(0)
摘要:插值查找算法类似于二分查找,不同的是插值查找的每次从自适应mid出开始,这和二分查找升级版用到的是一个方法 int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]); 含义:预测数字出现的位置 阅读全文
posted @ 2020-02-08 10:42 Axs 阅读(165) 评论(0) 推荐(0)
摘要:二分查找也叫折半查找必须在有序存储中查找 思路:顾名思义每次查找一半,直到找到为止 过程:先定义一个中位数,把数据分为左右两个部分,跟要找的数进行比较,小于则往左递归,大于则往右递归 由上述过程可以知道对于找到数的快慢决定点在于对于中位数的,当中位数越接近要找到的值,则查找速度越快 这里中位数的定义 阅读全文
posted @ 2020-01-14 21:07 Axs 阅读(153) 评论(0) 推荐(0)
摘要:归并排序属于稳定排序,时间复杂度为O(nlogn) 思路:采用分治策略,将问题分成一些小的问题然后递归求解,治的部分是将分的部分得到的答案和在一起,即为分而治之 过程:这里用图来显示比较直观 import java.util.Arrays; public class MergeSort { publ 阅读全文
posted @ 2019-12-31 09:49 Axs 阅读(156) 评论(0) 推荐(0)
摘要:快速排序属于不稳定排序,时间复杂度为O(n^2),是对冒泡排序的一种改进 思路:将数据分成2个部分,一部分比另一部分都要小,然后再对这两个部分分别进行快速排序,递归完成 过程:选取数据中的中间数作为基准数,把大于基准数的数据放在右边一组,小于的放在左边一组,然后在对这两组数据分别进行上面的操作,直到 阅读全文
posted @ 2019-12-30 11:27 Axs 阅读(158) 评论(0) 推荐(0)
摘要:希尔排序(Shell's Sort)属于不稳定排序,时间复杂度为O(n^s) 1<s<2,是插入排序的一种更高效的改进版本,也称为缩小增量排序 思路:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终 阅读全文
posted @ 2019-12-30 11:20 Axs 阅读(163) 评论(0) 推荐(0)
摘要:基数排序属于稳定排序,时间复杂度为O(logRB),桶排序为基数排序的扩展 思路:将整位数切割成不同的数字,然后按每个位数分别比较 过程:设置10个桶子分别从0到9,将每个元素的个位数取出,与桶的数字相对于就放入,然后按照桶顺序依次取出数据,放入原来的数组,接着按照这个步骤取十位数,没有的补0,后面 阅读全文
posted @ 2019-12-29 11:55 Axs 阅读(220) 评论(0) 推荐(0)
摘要:插入排序属于稳定排序,他的时间复杂度为O(n^2) 思路和过程:把n个待排序的元素分为有序表和无序表,开始前有序表只有一个元素即n个元素的中的第一个,无序表中有n-1个元素,开始排序时从无序表中取出当前第一个元素,和有序表中相比较,将他插入到合适位置,当无序表中的元素提取完,排序即可完成 优化:当有 阅读全文
posted @ 2019-12-29 11:36 Axs 阅读(130) 评论(0) 推荐(0)