
算法
文章平均质量分 62
算法
u013250861
这个作者很懒,什么都没留下…
展开
-
路径算法:遗传算法 (Genetic Algorithm, GA)
遗传算法是受自然进化理论启发的一系列搜索算法。通过模仿自然选择和繁殖的过程,遗传算法可以为涉及搜索,优化和学习的各种问题提供高质量的解决方案。同时,它们类似于自然进化,因此可以克服传统搜索和优化算法遇到的一些障碍,尤其是对于具有大量参数和复杂数学表示形式的问题。原创 2022-12-22 22:33:04 · 2608 阅读 · 0 评论 -
路径算法:蚁群算法(ant colony optimization, ACO)
D-F三只蚂蚁访问,留下信息素为: \dfrac{1}{L_1}\times n_{L_1} +\dfrac{1}{L_2}\times n_{L_2} + \dfrac{1}{L_3}\times n_{L_3}=\dfrac{1}{20} \times 1 +\dfrac{1}{25} \times 1 + \dfrac{1}{27} \times 1 = 0.127。\alpha 信息启发因子,值越大,则蚂蚁选择之前走过的路径可能性就越大,值越小,则蚁群搜索范围就会减少,容易陷入局部最优。原创 2022-12-22 22:35:01 · 1910 阅读 · 0 评论 -
Manacher算法【用于求解字符串中最长回文子串的问题】
L LL数组的作用:L [ i ] − 1 L[i]-1L[i]−1可以表示该子串在原串中对应的回文串的长度,例如上面图片中b bb的L LL值为4,那么原串a a b a b aababaabab中,以b bb为对称中心的回文串长度为4 − 1 = 3 4-1=34−1=3。一行小写英文字符 a , b , c , ⋯ , y , z \texttt a,\texttt b,\texttt c,\cdots,\texttt y,\texttt za,b,c,⋯,y,z 组成的字符串 S。原创 2022-12-22 22:31:01 · 118 阅读 · 0 评论 -
KMP算法(KMP Algorithm)【字符串匹配算法】【现有文本串 t 与模式串 p,要求用尽可能小的时间复杂度找到并输出 p 在 t 出现的所有位置】
KMP 算法的应用范围要比 Manacher 算法广,Manacher 算法只能应用于「回文串」问题,相对比较局限,而「子串匹配」问题还是十分常见的。背过这样的算法的意义在于:相当于大脑里有了一个时间复杂度为 O(n) 的 api 可以使用,这个 api 传入一个原串和匹配串,返回匹配串在原串的位置。力扣KMP Algorithm - 知乎。原创 2022-12-22 22:18:19 · 513 阅读 · 0 评论 -
最短路径算法:维特比算法(Viterbi)(基于动态规划思想)【解决篱笆网络的最短路径问题】【应用场景:分词、命名实体识别、词性标注】【每个节点只保留其来时最优路径】
一、维特比算法(Viterbi Algorithm)讲解方式01:篱笆网络(Lattice)的最短路径问题已知下图的篱笆网络,每个节点之间的数字表示相邻节点之间的距离,举个例子来说,如果我走,这个距离是。那么如果让你从A走到E,最短路径是哪一条呢?显然大家都知道,通过穷举的方法是很容易得到最短路径,可是问题就在于如果穷举的话,需要的加法次数不用算你也知道实在是太多啦(每条路径需要计算次加法,一共条路径共次计算)!像这种没几层的篱笆网络也就罢了,如果每层13个节点,一共12层(然而这个规模对于标注问题来原创 2022-02-05 20:46:46 · 2443 阅读 · 1 评论 -
最短路径算法:迪杰克斯拉(Dijkstra)算法(基于贪心思想)【从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题】【能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低】
迪杰斯特拉(Dijkstra)算法:从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题原创 2022-01-29 23:45:00 · 2051 阅读 · 0 评论 -
预测解码算法:①贪心算法(当前时间步最优解)、②BeamSearch算法(每个时间步都保留前k个最优解)、③维特比算法(动态规划,全局最优解)
预测解码算法:①贪心算法(当前时间步最优解)、②BeamSearch算法(每个时间步都保留前k个最优解)、③维特比算法(动态规划,全局最优解)参考资料:[L2]seq2seq中Beam search~贪心与维特比维特比算法与beam search...原创 2022-01-28 22:45:00 · 534 阅读 · 0 评论 -
Levenshtein编辑距离
Levenshtein编辑距离原创 2022-01-13 23:56:49 · 166 阅读 · 0 评论 -
算法:算法概述【时间复杂度、空间复杂度】
1、算法定义算法:为了实现业务目的的各种方法和思路就是算法。同样的数据,同样的目的, 不同的算法,不同的方法和思路,效率就会不同算法是一种独立的存在 , 它并不依附于代码 , 代码只是实现算法思想的方式而已。算法是独立存在的一种解决问题的方法和思想对于算法而言,实现的语言并不重要,重要的是思想算法可以有不同的语言描述实现版本(如C描述、C++描述、Python描述等)2、算法的五大特性输入: 算法具有0个或多个输入输出: 算法至少有1个或多个输出有穷性: 算法在有限的步骤之后会自动结原创 2020-10-25 23:42:54 · 1813 阅读 · 0 评论 -
算法:递归
参考资料:Linked List Problems原创 2021-05-02 14:05:17 · 114 阅读 · 0 评论 -
算法-排序算法:概述
十种常见排序算法可以分为两大类:- **比较类排序**:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlog2n),因此也称为非线性时间比较类排序。- **非比较类排序**:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 相关概念:- **稳定**:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。- **不稳定**:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的...原创 2020-10-26 23:17:46 · 348 阅读 · 0 评论 -
算法-排序算法:选择排序O(n^2)【当遍历到第3个元素时,则排序后第3个元素肯定是全局排名第3的元素】、插入排序O(n^2)【当遍历到第3个元素时,则排序后第3个元素是前3个元素中排名第3的元素】
一、选择排序(Selection Sort)O(n2)选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n原创 2021-05-02 21:33:42 · 154 阅读 · 0 评论 -
算法-排序算法:冒泡排序(BubbleSort )【O(n^2)】【经典但是排序思路在生活中并不常用】
冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。一、冒泡排序算法的运作机理比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了原创 2021-05-04 21:07:30 · 255 阅读 · 0 评论 -
算法-排序算法:归并排序(Merge Sort)【O(nlogn)】【自顶向下:递归方式;自底向上:非递归方式】【稳定;最坏/最优时间复杂度:O(nlogn);空间复杂度:O(n)】
归并排序(Merge Sort):建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。一、归并排序-算法描述:把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分别采用归并排序;将两个排序好的子序列合并成一个最终的排序序列;归并的过程无法原地完成;二、归并排序-过程分析每2组合并原创 2021-05-02 21:39:47 · 871 阅读 · 1 评论 -
算法-排序算法:快速排序(QuickSort )【O(nlogn)】【单路:随机化无法避免元素全相等时退化为O(n^2)】、【双路+随机化:元素全相等时退化概率极低】【三路:元素全相等时为O(n)】
4、快速排序(Quick Sort)O(nlogn)快速排序(Quick Sort)的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。2.1 快速排序-算法描述:快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:从数列中挑出一个元素,称为 “基准”(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后原创 2021-05-02 21:41:04 · 1542 阅读 · 0 评论 -
算法-排序算法:堆排序(HeapSort )【O(nlogn)】
MyArray.java/** * 数组 * * @author * @version 2018/8/4 */public class MyArray<E> { private E[] arr; private int size; public MyArray(int capacity){ arr = (E[])new Object[capacity]; size = 0; } public MyArray() { this(10); } publ原创 2021-05-04 16:56:33 · 152 阅读 · 0 评论 -
算法-排序算法:希尔排序(Shell Sort)【O(n^2)】
希尔排序(Shell Sort):1959年Shell发明,第一个突破O(n2)的排序算法,是插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。一、希尔排序-算法描述:先将整个待排序的序列A按照一个“增量”(gap)分割成为若干子序列,然后分别进行直接插入排序,具体算法描述:选择一个增量序列(gap 序列) t1,t2,…,ti,tj,…,1{t_1, t_2, …, t_i, t_j, …,1}t1,t2,…,ti,tj,…,1,其中ti&原创 2021-05-04 21:10:05 · 357 阅读 · 0 评论 -
算法-搜索算法:二分查找(Binary Search)【前置条件:待查数据集必须是有序结构,可以右重复元素】【时间复杂度:O(logn)】
>**搜索**:是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找# 一、二分法查找>**二分查找**又称折半查找,优点是比较次数少,查找速度快,平均性能好;缺点是要求待查表①必须采用顺序存储结构 ②必须按关键字大小有序排列,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。- 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查原创 2020-10-27 00:32:11 · 1306 阅读 · 0 评论 -
算法-五大常用算法:回溯算法
数据结构与算法-五大常用算法:回溯算法原创 2021-02-27 22:15:16 · 189 阅读 · 0 评论 -
算法-五大常用算法:动态规划(DP)算法【先求解小数据量下问题的结果,然后层层递推,求解更大的数据量的问题的结果】【维特比算法(Viterbi Algorithm)属于动态规划算法】
动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对原创 2021-02-03 23:30:24 · 2217 阅读 · 0 评论 -
算法-五大常用算法:贪心算法(Greedy Algorithm)
顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。该算法存在问题:不能保原创 2021-02-03 23:33:04 · 673 阅读 · 0 评论 -
算法-五大常用算法:分治算法(Divide-and-Conquer)
分治法,字面意思是“分而治之”,就是把一个复杂的1问题分成两个或多个相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并,这个思想是很多高效算法的基础,例如排序算法(快速排序,归并排序),傅里叶变换(快速傅里叶变换)等。分治法的基本思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。分治策略:对于一个规模为n的问题,若该问题可以容易的解决(比如规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相原创 2021-02-28 22:08:46 · 1089 阅读 · 0 评论 -
算法-五大常用算法:分支限界算法
分支限界算法:类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是满足约束条件的一个解,或是从满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。分支限界法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索。该算法在具体执行时,把全部可行的解空间不断分割为越来越小的自己(成为分支),并为每个自己内的解的值计算一个下界或上原创 2021-02-27 22:14:31 · 199 阅读 · 0 评论 -
算法:BeamSearch算法【贪心、维特比的折中方案】【贪心算法:每次只选择概率最大的结果,作为当前时间步的输出】【维特比算法:利用动态规划得到最优解,但时间复杂度太大;O(N*V^2)】
Beam Search 是一种受限的宽度优先搜索方法,经常用在各种 NLP 生成类任务中,例如机器翻译、对话系统、文本摘要。在生成文本的时候,通常需要进行解码操作,贪心搜索 (Greedy Search) 是比较简单的解码。假设要把句子 “I love you” 翻译成 “我爱你”。则贪心搜索的解码过程如下:贪心搜索每一时刻只选择当前最有可能的单词,例如在预测第一个单词时,“我” 的概率最大,则第一个单词预测为 “我”;预测第二个单词时,“爱” 的概率最大,则预测为 “爱”。贪心搜索具有比较高的运行效率原创 2021-01-30 23:15:49 · 4953 阅读 · 0 评论 -
算法-字符串算法:KMP、模式匹配
对于字符串匹配算法中,前面介绍的算法在字符串匹配中都会有重复比较的情况,那么对于已经比较过的子串,我们是否可以用某种方法把它保存起来,等到下次要比较的时候直接跳过已经比较过的字符串呢?表示当字符串匹配时的有效偏移。原创 2021-04-30 18:59:07 · 127 阅读 · 1 评论 -
算法:倒排表/倒排索引(Inverted index)
搜索引擎最核心的技术, 倒排索引技术,倒排索引可能需要分成几篇文章才说得完,我们先会说说倒排索引的技术原理,然后会讲讲怎么用一些数据结构和算法来实现一个倒排索引,然后会说一个 索引器怎么通过 文档来生成一个倒排索引。什么是倒排索引呢?索引我们都知道,就是为了能更快的找到文档的数据结构,比如给文档编个号,那么通过这个号就可以很快的找到某一篇文档,而倒排索引不是根据文档编号,而是通过文档中的某些个词而找到文档的索引结构。倒排索引技术简单,高效,简直是为搜索引擎这种东西量身定做的,就是靠这个技术,实现一个搜索引擎原创 2021-02-06 23:56:41 · 3994 阅读 · 1 评论