![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习
文章平均质量分 91
Chary Liu
这个作者很懒,什么都没留下…
展开
-
排序算法实现&总结(java版)
1. 冒泡排序比较相邻的元素,如果前一个大于后一个,就交换二者;对每一对相邻元素做同样的工作,每一轮把当前未排序部分的最大数字移到最后。void bubbleSort(int[] array){ int length = array.length; for(int i=0; i < length-1; i++){ for(int j=0; j < length-i-1; j++){ if(array[j] > array[j+1]原创 2021-03-13 19:52:55 · 103 阅读 · 0 评论 -
贪心算法-Dijkstra优化
引言上一篇Dijkstra算法伪代码第7行:在每次刷新d(v)之后,找出最小的d(v),这个地方具体用什么方法是没有说的,不同的找最小的方法和所涉及的数据结构的时间复杂度也是不一样的。最直接暴力的思路就是一个for循环遍历PQ中的d(v)找出最小的,但时间复杂度太高,需要遍历所有点,总的时间复杂度就是O(n2)O(n^2)O(n2),点很多的时候,这个算法就很慢了。因此,我们需要在如何找最小值这进行优化。Dijkstra优化我们来看一下存储d(v)的数据结构需要支持什么。在Dijkstra算法中原创 2020-08-31 11:56:18 · 781 阅读 · 0 评论 -
贪心算法-最短路径问题(从动态规划优化到贪心)
最短路径问题问题描述给定一个图G=⟨V,E⟩G=⟨V,E⟩G=⟨V,E⟩,对于图中每条边e=⟨i,j⟩e=⟨i,j⟩e=⟨i,j⟩都有一个距离di,jd_{i,j}di,j。起始点是s,终点是t,问从s到t的最短路径是多少?解决方法1.动态规划最短路径问题是一个多步决策问题,所以可以先考虑用动态规划来求解。如果我们用OPT(i,j)表示点i到点j的最短路径,如果图中存在负值的边、负值环路,就转移方程会出现类似陷入循环等问题,而且转移方程无法与明确的d(u,v)做关联。所以我们通过引入一个新变量原创 2020-08-30 17:47:17 · 8358 阅读 · 0 评论 -
贪心算法-动态规划与贪心的区别
引言在学习完分治和动态规划之后,我们来学习贪心算法。解决问题的观察思路和解决方法的选择可如下图所示。可分可以使用分治思想,如果是最优化问题,并且可以多步决策、有最优子结构,则可以使用动态规划,再进一步,如果还具有贪心选择的性质,则可以使用贪心算法。贪心算法概念贪心算法和动态规划很像,贪心算法主要是在动态规划上多了贪心选择性质,贪心算法是在多步决策每一步都要直接最优,而不是通过动态规划那样枚举,最后这些局部最优解组成了全局最优。排课问题我们利用排课问题来具体阐述贪心算法与动态规划的差别。问题描原创 2020-08-29 18:38:12 · 1290 阅读 · 0 评论 -
动态规划-序列联配问题(3)减少冗余计算
引言在前文中,已经利用分治思想,将原本需要O(mn)空间复杂度的动态规划问题转换成只需要O(m+n),进一步地,在本文中,我们考虑能否将时间复杂度也降低。最终实现的结果是将O(mn)的时间复杂度降低到O(αmax{m,n})。减少冗余计算问题分析考虑如果两个需要对齐的字符串很不相似(例如“gold”,“time”),我们是否还有必要用动态规划的方式对其计算相似度?设计动态规划对齐两个字符串的目的(我们从应用出发),如修正用户的错误输入,对比文章是否抄袭,这些都建立在两者较为相似的情况下(这个较为相似原创 2020-08-17 16:42:27 · 475 阅读 · 0 评论 -
动态规划-序列联配问题(2)以算代存
引言接着上篇,对于两个字符串Sm,TnS_m,T_nSm,Tn ,我们计算其最优对齐,需要的数组空间是O(mn)。最优对齐的方法在处理短字符串的时候内存还可以承受,但是当处理输入变成一整篇论文这样的东西时,内存就受不了了。另一方面,由于算法采用2层for循环计算二维数组m x n,但最后我们很可能用不到那些多余的内容(数组的边角部分),这就产生了浪费。高级动态规划动态规划对于最优解的获取有着十分显著的效果,但是其占用大量的存储空间和许多不必要的计算。而高级动态规划弥补了这一缺陷,其节省了存储空间和原创 2020-08-17 10:34:28 · 284 阅读 · 0 评论 -
动态规划-序列联配问题(1)最优对齐
引言序列联配是生物信息学最基础的概念,例如基因序列。大多数数据分析分析策略都需要使用联配得到的信息。例如输入法场景,我们有一个字典词库,用户输入的单词S(可能输错),我们需要尽快地找到字典词库中与它最像的单词,修正用户的输入。问题问题描述两个字符串序列S=S1S2...Sn,T=T1T2...Tn,S = S_1S_2...S_n,T = T_1T_2...T_n,S=S1S2...Sn,T=T1T2...Tn,计算联配(S′,T′),使得编辑操作数目s(S′,T′)最小。问题分析原创 2020-08-16 16:31:41 · 1710 阅读 · 0 评论 -
动态规划-解题4步曲
问题描述与分析问题以换硬币问题来讲解一下动态规划解题4步曲:你有三种硬币,分别面值2元,5元和7元,每种硬币都有足够多。买一本书需要27元。如何用最少的硬币组合正好付清,不需要对方找钱?关键词“用最少的硬币组合”——求最值问题,可以用动态规划来解决。简单分析正常人第一反应思路:最少硬币组合?优先使用大面值硬币——7+7+7+5=26 额?可求解目标是27啊……改算法——7+7+7+2+2+2=27,总共用了6枚硬币正好27元.实际正确答案:7+5+5+5+5=27,才用了5枚硬币。所以原创 2020-08-15 17:13:11 · 557 阅读 · 0 评论 -
动态规划-01背包问题解析
问题描述有n个物品,它们有各自的体积和价值,现有给定总体积为W的背包,如何让背包里装入的物品具有最大的价值总和?i(物品编号)1234w(体积)2345v(价值)3456思路概述多步决策问题–>子问题定义–>递归表达式–>重复冗余子问题01背包问题可以进行多步决策,每一次选择一个物品是否放入背包,0就是不放入,1就是放入,然后我们可以得到下面的递推表达式:通过填写表把所有已经解决的子问题答案纪录下来,在新问题里需要用到的子问原创 2020-08-12 10:29:05 · 510 阅读 · 0 评论 -
动态规划-初篇
引言:最优化问题什么是最优化问题?假设一个问题可以表示为一个目标函数,其输入是可行解(可行解由问题的约束规定),输出是可行解的质量刻画(可行解是否足够好),一般求目标函数的最小值或最大值。举例1已知x1+x2+x3=10,且x1,x2,x3∈N+x_1+x_2+x_3=10,且x_1,x_2,x_3∈N+x1+x2+x3=10,且x1,x2,x3∈N+,求g(x1,x2,x3)=x1x2x3g(x1,x2,x3)=x_1x_2x_3g(x1,x2,x3)=x1x2x3的max,在这原创 2020-08-10 11:39:24 · 198 阅读 · 0 评论 -
分治思想-终篇
正难则反,大难则小先写一个笨算法,然后找冗余消除如果问题没有任何结构,则引入结构采样固定值变成可调变量手动/计算机执行,观察规律子树不一定用儿子,还可以用孙子分治思想在数组上的运用,总的来说可以归纳为两种:根据下标划分:归并划分稳定,保证每次都能使得数据规模指数级下降,达到降维的目的,但依赖更多的空间,在大数据情况下开销较大根据数值划分:快排、选择划分不稳定,依赖于piviot的选择合适与否,但大部分情况下都能做到数据规模指数级下降,且不依赖多余空间,应用要更为广泛...原创 2020-08-02 16:50:22 · 172 阅读 · 0 评论 -
分治思想-快速傅立叶变换(FFT)
引言DFT:离散傅立叶变换,求一个多项式在n个特殊点的值;FFT:DFT的改进的快速实现常见应用:两个多项式相乘(和两个n位整数相乘);时频变换;求解偏微分方程;FFT中运用了分治的思想问题描述给定一个多项式A(x)=a0+a1x+...+an−1xn−1A(x) = a_0+a_1x+...+a_{n-1}x^{n-1}A(x)=a0+a1x+...+an−1xn−1,求其在给定的点:1,ω,ω2,...,ωn−11,\omega,\omega^2,...,\omega^{n-1}1,ω原创 2020-08-02 16:47:10 · 1722 阅读 · 4 评论 -
分治思想-ClosestPair Problem
引言本文主要介绍分治思想在点集当中的应用,例如物流快递中各个地点的位置组合都可以看作点集,对这类问题的分治不再是简单的数组归约。我们用“平面上最近点对寻找问题(ClosestPair Problem)”来引入。问题描述Input:平面内的n个点构成的点集Output:最短距离的一对点简单分析如果我们使用最简单的思路,直接双重循环,对每一个点对遍历计算距离,如果小于当前最小距离,则更新(当然可以去除重复比较和自身与自身比较的情况),时间复杂度是O(n^2)。当需要处理的数据量巨大时,耗时就会原创 2020-08-01 15:17:49 · 457 阅读 · 0 评论 -
分治思想-理解快速排序
原理快速排序vs归并排序,前者基于数值大小划分,后者基于index划分。快速排序不需要额外的存储空间,这一点使得它优于归并排序,因为归并排序需要额外一倍存储空间存储排序数组。快速排序从数组中找一个pivot,将小于piovt的放到左边,大于pivot的放到右边。伪代码如下:QuickSort(A): S− ={};S+ ={};//s-存小于,s+存大于 Choose a pivot A[j];//随机选择 for i=0 to n−1 do Put原创 2020-05-21 16:56:28 · 198 阅读 · 0 评论 -
分治思想-选pivot问题
前言选择的pivot会影响比较次数。为了进一步理解如何选pivot,我们从找出数组中第k小的数问题入手来理解。例子:寻找第k小的元素问题叙述给定一个乱序数组A,试求该数组中第k小的元素?最直接的解决办法就是数组排序返回index为k-1的元素,排序选用快排或归并(若不考虑内存使用),时间复杂度是O(nlogn)。思考一下,实际上这个问题没有必要将数组完全排序再找第k个元素。解决思路参考快排的策略,我们可以有思路,将小于pivot的放到左边,大于pivot的放到右边。试想,如果有一个数左边的数原创 2020-05-20 21:35:56 · 558 阅读 · 0 评论 -
分治思想-初篇
分而治之思想问题在面对一个问题时,如何解决问题的思路如下。graph LR问题-->不可解问题-->可解可解-->不可分可解-->可分不可分-->完整解可分-->部分解部分解-->从最简单情况的入手分治思想分治思想:分而治之:分成子问题、解决子问题、合并子问题的解一个复杂可解问题是可分的,即可以被化简为多个简单的子问题子问题的解可以合并为复杂问题的解如果满足以上两个条件,则称此问题是可分的,可以使用分治思想解决此问题。判断是否原创 2020-05-17 20:28:43 · 449 阅读 · 0 评论 -
时间复杂度和空间复杂度
一、说明时间复杂度和空间复杂度是用来评价算法效率高低的2个标准。时间复杂度:就是说执行算法需要消耗的时间长短,越快越好。比如for循环次数。空间复杂度:就是说执行当前算法需要消耗的存储空间大小,也是越少越好。计算机的存储资源是有限的,算法耗费的存储空间不可超限。但这二者有时是冲突的,所以我们需要做权衡利弊。二、时间复杂度的计算表示方法我们一般用“大O符号表示法”来表示时间复杂度:T(n) = O(f(n))n是影响复杂度变化的因子,f(n)是复杂度具体的算法。常见的时间复杂度量级常数阶原创 2020-05-17 19:31:26 · 1155 阅读 · 0 评论