![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
【Java语言版】算法,需要先学习【数据结构】,很重要!!
loetca
这个作者很懒,什么都没留下…
展开
-
算法-21-普利姆算法
二十一、普利姆算法(Prim)0、最小生成树从一个带有权值的无向连同图中,选择出一颗所有边上权值的和最小的树,这就是最小生成树(Minimum Spanning Tree, MST)。特点:有n个顶点,则对应n-1条边节点包含全部的顶点生成最小生成树的算法主要是Prim和Kruskal1、Prim算法概念在包含n个顶点的连通图中,找出只有n-1条边包含所有n个顶点的连通图,这就是极小连通图。2、过程从指定的起始顶点开始查找。创建一个和顶点数组长度一样的数组,用于标记某个顶点原创 2021-04-11 21:34:15 · 269 阅读 · 0 评论 -
算法-20-贪心算法
二十、贪心算法1、概念在对问题求解时,尽量每一步选择是最好或最优的,从而希望结果也是最好或最优的解法。在实际运用时,得到的结果不一定是最优的结果,但都是相对接近最优的结果。常用于集合覆盖等问题。2、集合覆盖问题现有几个元素,每个元素都能满足一定的场景,且存在重复的场景,问怎样组合元素,才能使得所有元素所满足的场景最多(尽量不重复),且选择的元素数量最少。如果使用穷举法来组合每个元素,则随着元素数量的增加,组合的结果也会跟着增加。公式是2^n - 1。这是一个指数阶,非常地耗时。但是使用贪心原创 2021-04-11 21:32:04 · 506 阅读 · 0 评论 -
算法-19-字符串匹配算法
十九、字符串匹配算法1、暴力匹配用子字符串去依次匹配主字符串的每一个字符,直到匹配完子字符串的全部字符(找到了)或匹配完主字符串的全部字符(没找到)。需要两个索引,分别记录匹配主字符串和匹配子字符串的字符索引位置,如果遇到相同的字符,则后移两个索引位置,否则就将主字符串匹配索引移动到当前索引位置减去子字符串索引位置,再后移一位,并重置子字符串索引位置为0,然后再重新匹配主字符串的字符元素。示例public int violenceSearch(final String str, final Str原创 2021-04-11 21:28:56 · 219 阅读 · 0 评论 -
算法-18-动态规划
十八、动态规划(Dynamic Programming)1、概念和分治算法类似,动态规划也是将大问题划分为多个小问题解决,最终获取最优解的算法。不同的是,动态规划所拆分的小问题之间存在依赖性,即下一步骤的解决依赖于上一步骤的解决。可以通过填表法来逐步推进问题的解决,最终得到最优解。2、背包问题现有一个背包,存在容量上限,还有若干物品,分别有对应的体积和价值。要求在不超过背包容量上限的情况下,装入背包中的物品的总价值最大。问如何选择物品。01背包:要求装入的物品不能重复,即每个物品的数量最多一个原创 2021-04-11 21:27:29 · 134 阅读 · 0 评论 -
算法-17-分治算法
十七、分治算法1、概念分治(Divide-and-Conquer),分而治之,将一个复杂的问题,分成两个或多个相同或类似的子问题,再把子问题分成更小的子问题,直到问题简单到可以直接求解,再将所有的子问题的解合并成一个解,即原问题的解。应用:快速排序、归并排序、二分查找、汉诺塔问题等2、汉诺塔问题一共有三根柱子,在其中一根柱子上,从上往下按照从小到大的顺序放着n个圆盘(64个)。现在需要将这些圆盘还按照从小到大的顺序放置到另外的一根柱子上,要求每次只能移动一个圆盘,且小圆盘只能放到大圆盘上。问全部移原创 2021-04-11 21:25:30 · 95 阅读 · 0 评论 -
算法-16-哈夫曼编码
十六、哈夫曼编码(Huffman Coding)1、概念它是哈夫曼树(Huffman Tree)在电讯通信领域中的经典应用。广泛应用于数据文件的压缩,压缩率一般在20% ~ 90%之间,属于**可变长编码(VLC)**的一种,重复的内容越多,压缩率越好。但是一个文件如果已经是压缩过的,那么再次压缩,其文件大小可能不会有明显的变化。它属于无损压缩。2、原理定长编码,将信息的原本形式,先转换为字节数组(byte[]),然后再获取每一个字节所对应的二进制(低8位),再进行数据的传输。变长编码,将信息原创 2021-04-11 21:23:35 · 376 阅读 · 0 评论 -
算法-15-斐波那契查找
十五、斐波那契查找0、斐波那契数列第一个元素和第二个元素都是1,之后从三个元素开始,它的值等于前两个元素的和,每个元素之间的比值接近于0.618。示例前10个:1 1 2 3 5 8 13 21 34 55代码实现/** * 递归版 */public int fibonacci(int n) { if (0 >= n) { throw new IllegalArgumentException("n must > 0!"); } if (1原创 2021-04-11 21:20:08 · 103 阅读 · 0 评论 -
算法-14-插值查找
十四、插值查找1、概念和二分查找类似,不同的是中间索引位置,不是(最小索引 + 最大索引) / 2,而是最小索引 + (最大索引 - 最小索引) × (待查找元素值 - 最小索引元素值) / (最大索引元素值 - 最小索引元素值)元素序列必须是有序的。2、示例public int interpolationSearch(int[] array, int element) { int len = array.length; if (element < array[0] ||原创 2021-04-11 21:18:59 · 210 阅读 · 0 评论 -
算法-13-二分查找
十三、二分查找1、概念使用二分的思想,将序列分为两部分,并比较待查找元素和中间索引元素值的大小,如果相等就返回中间索引;如果小于,则查找起始索引到中间索引的前一位;如果大于,则查找中间索引的后一位到终止索引。元素序列必须是有序的。2、示例返回找到的一个索引值/** * 递归版 */public int binarySearch(int[] array, int element) { int len = array.length; if (element < array原创 2021-04-11 21:17:35 · 112 阅读 · 0 评论 -
算法-12-线性查找
十二、线性查找1、概念按照顺序,依次查找给定元素序列,直到找到为止。元素序列可以是无序的。2、示例public int linearSearch(int[] array, int element) { for (int i = 0, len = array.length; i < len; i++) { if (element == array[i]) { return i; } } return -1;}原创 2021-04-11 21:16:02 · 61 阅读 · 0 评论 -
算法-11-堆排序
十一、堆排序(Heap Sort)1、概念使用堆数据结构,而实现的一种排序。分为大顶堆和小顶堆两种:大顶堆,它是一棵完全二叉树,每个节点的值都大于或等于其左右子节点的值,但是没有规定左子节点的值和右子节点的值的大小关系。正序使用大顶堆。array[i] >= array[i * 2 + 1] && array[i] >= array[i * 2 + 2]小顶堆:它是一棵完全二叉树,每个节点的值都小于或等于其左右子节点的值,但是没有规定左子节点的值和右子节点的值原创 2021-04-07 00:41:17 · 81 阅读 · 0 评论 -
算法-10-基数排序
十、基数排序(Redix Sort)1、概念又称桶排序,它是利用排序桶,将排序序列按照从最低位到最高位的排序,以实现最终的排序。优化:初始化排序桶时,不要指定桶元素数组,在每次添加桶元素时,再动态地扩容桶元素数组,并添加元素。2、过程获取最大值的个数,即需要重新给定排序序列元素的次数。创建排序桶,非负数(0~9),个数就是10个。从最低位到最高位进行重新给定排序序列元素,以当前位的值取余桶的个数,得到桶索引,并更新桶元素个数统计值。遍历所有的桶,重新分配排序序列元素的索引位置。3、示例原创 2021-04-07 00:39:18 · 125 阅读 · 2 评论 -
算法-9-归并排序
九、归并排序(Merge Sort)1、概念使用归并思想,将排序序列进行分-合的操作,实现最终的排序。分-合(devide-conquer):将问题分为一些小问题,递归(也可以采用迭代的方式)拆分子序列(完全二叉树),各个求解,再将得到的各个答案,合并在一起。 34158276 3415 8276 34 15 82 763 4 1 5 8 2 7 6 34 15 28 67 1534原创 2021-04-07 00:37:05 · 116 阅读 · 0 评论 -
算法-8-快速排序
八、快速排序(Quick Sort)1、概念使用二分的思想,每次将排序序列分成两组。找到中间索引元素值,依次比较两端元素值和中间索引,后移开始索引,前移结束索引,不断地向中间索引位置逼近,如果开始索引大于结束索引,则跳出循环,否则就交换两端索引值,如果两端有元素值等于中间索引值,则需要移动对端索引值。最后判断开始索引和前移后的结束索引之间是否还有元素,如果存在,则仍需快排。同理后移后的开始索引和结束索引之间也要判断是否需要进行快排。快速排序属于交换排序的一种。2、过程首先定义一个排序方法,入原创 2021-04-07 00:36:07 · 104 阅读 · 0 评论 -
算法-7-希尔排序
七、希尔排序(Shell Sort)1、概念使用二分的思想,将排序序列分组,直到每组的元素数量是1为止。交换式:以分组元素数量为索引间距,依次比较每个分组的首元素和尾元素,若发现逆序,则交换元素顺序(在比较过程中,排好多个组的顺序)。最终将所有组的元素都比较一遍,实现最终的排序。位移式:以分组元素数量为索引间距,对每个分组进行直接插入排序(依次比较每个分组的首元素和尾元素,若发现逆序,则将首元素的值覆盖掉尾元素的值,比较完毕后,再将尾元素的值覆盖掉上次比较到逆序的元素索引的下一个索引间距的元素的值。原创 2021-04-07 00:35:02 · 126 阅读 · 0 评论 -
算法-6-直接插入排序
六、直接插入排序(Insert Sort)1、概念从排序序列的头开始比较,第一次比较前两个元素,第二次比较前三个元素,依次类推,直到比较所有的元素。每次拿初始查找索引元素值进行从后向前的比较,如果该索引元素值小于(正序)前一位索引元素值,则将前一位的索引值覆盖掉当前索引索引值,然后前置索引,依次比较,直到比较到头(索引=0),并用初始查找元素值覆盖掉初始查找索引的下一位。反复比较,实现最终排序。直接插入排序属于插入排序的一种。2、过程两层嵌套循环。外层循环,用于指定排序索引的初始位置,从原创 2021-04-07 00:34:05 · 176 阅读 · 0 评论 -
算法-5-简单选择排序
五、简单选择排序(Select Sort)1、概念从排序序列的待确认元素索引位置开始比较,从前往后,找到最小值(正序),整个排序序列比较完成后,可以确认一个最值,与开始比较的索引值进行交换。反复比较,实现最终排序。简单选择排序属于选择排序的一种。2、过程两层嵌套循环。外层循环,用于表示是第几次比较,排序完成,需要比较排序序列元素个数次。用一个临时变量记录本次比较的起始下标,再用一个临时变量记录本次比较的起始下标对应的元素值。内层循环,用于比较两个元素的大小,从本次查找的起始下标的原创 2021-04-07 00:33:15 · 114 阅读 · 0 评论 -
算法-4-冒泡排序
四、冒泡排序(Bubble Sort)1、概念依次比较排序序列的待比较部分的相邻两个元素,每次可以确定一个较大值(正序),如果逆序则交换顺序,这样可以将其放到上次比较得出的最大值(正序)的前一位。反复比较,实现最终排序。它就像水底的气泡一样逐渐上冒。优化:每次比较时,可以增加一个判断,即本次排序比较中,是否有过交换元素顺序,若没有交换过,即已排序完毕,无需再次比较。冒泡排序属于交换排序的一种。2、过程两层嵌套循环。内层循环,用于比较相邻两个元素的大小,从下标0开始,到排序序列元素个数减1,原创 2021-04-07 00:32:15 · 276 阅读 · 0 评论 -
算法-3-递归
recursion【递归】原创 2020-01-06 22:28:29 · 135 阅读 · 0 评论 -
算法-2-空间复杂度
二、算法空间复杂度(Space Complexity)1、概念一个算法的空间复杂度(Space Complexity)定义为该算法所耗费的存储空间,是算法在运行过程中,临时所占用的存储空间大小的度量,它也是一个算法规模为n的函数。有的算法需要占用的临时工作单元数和解决问题的规模n有关,它会随着n的增大而增大,当n较大时,将会占用较多的存储单元。2、实际应用一般对算法的分析和讨论,更多的是看时间复杂度,也即程序执行的效率(用户体验角度)。...原创 2021-04-07 00:29:47 · 93 阅读 · 0 评论 -
算法-1-时间复杂度
一、算法时间复杂度(Time Complexity)1、概念时间频度:一个算法所花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数越多,它所花费的时间也就越多。一般情况下,算法中的基本操作语句的重复执行次数,是问题规模n的某个函数,用T(n)表示。若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称 f(n) 是 T(n) 的同数量级函数,记作 T(n) = O(f(n)) 。我们称 O(f(n)) 为算法的渐进时间复杂度,简称时间复原创 2021-04-05 19:26:33 · 1393 阅读 · 0 评论