引子 果然老师们都只看标签拉题... 2020.8.19新初二的题集中出现了一道题目(现已除名),叫做Running In The Sky. OJ上叫绮丽的天空 发现需要处理环,然后通过一些神奇的渠道了解到有个东西叫缩点. 紧接着搜了一下缩点,发现了 Tarjan 算法. 然后又翻了翻算法竞赛,于是一去不复返-- 一些定义 给定一张有向图.对于图中任意两个节点 \(x, y\),存在从 \(x\) 到 \(y\) 的路径,也存在 \(y\) 到 \(x\) 的路径.则称该有向图为"强连通图&qu…
从这里开始 预备知识 两个数组 Tarjan 算法的应用 求割点和割边 求点-双连通分量 求边-双连通分量 求强连通分量 预备知识 设无向图$G_{0} = (V_{0}, E_{0})$,其中$V_{0}$为定点集合,$E_{0}$为边集,设有向图$G_{1} = (V_{1}, E_{1})$,其中$V_{1}$为定点集合,$E_{1}$为边集. 无向图中的路径:如果存在一个顶点序列$v_{p},v_{i_{1}},\cdots,v_{i_{k}},v_{q}$,使得$\left ( v_{…
目录 简述 作用 Tarjan 算法 原理 出场人物 图示 代码实现 例题 例题一 例题二 例题三 例题四 例题五 总结 简述 对于初学 Tarjan 的你来说,肯定和我一开始学 Tarjan 一样无比迷茫. 网上大框大框的定义就足以让一个萌新从入门到入土自闭. 所以本文决定不在这里对于 Tarjan 的定义和原理做过多介绍.(当然如果还是无法理解可以尝试直接理解代码) 注意&特别鸣谢:这篇文章,本文也有多处讲解与图片转自此文. 作用 其实这都是后话了....(毕竟你不会这个东西知道它的作用也没…
在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components). Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树.搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量.Tarjan算法有点类似于基于后序的深度遍历搜…
目录 前言 目录 循环神经网络 基于LSTM的分词 Embedding 数据预处理 模型 如何添加用户词典 前言 很早便规划的浅谈分词算法,总共分为了五个部分,想聊聊自己在各种场景中使用到的分词方法做个总结,种种事情一直拖到现在,今天抽空赶紧将最后一篇补上.前面几篇博文中我们已经阐述了不论分词.词性标注亦或NER,都可以抽象成一种序列标注模型,seq2seq,就是将一个序列映射到另一个序列,这在NLP领域是非常常见的,因为NLP中语序.上下文是非常重要的,那么判断当前字或词是什么,我们必须回头看…
目录 前言 目录 条件随机场(conditional random field CRF) 核心点 线性链条件随机场 简化形式 CRF分词 CRF VS HMM 代码实现 训练代码 实验结果 参考文献 前言 通过前面几篇系列文章,我们从分词中最基本的问题开始,并分别利用了1-gram和HMM的方法实现了分词demo.本篇博文在此基础上,重点介绍利用CRF来实现分词的方法,这也是一种基于字的分词方法,在将句子转换为序列标注问题之后,不使用HMM的生成模型方式,而是使用条件概率模型进行建模,即判别模型…
目录 前言 目录 隐马尔可夫模型(Hidden Markov Model,HMM) HMM分词 两个假设 Viterbi算法 代码实现 实现效果 完整代码 参考文献 前言 在浅谈分词算法(1)分词中的基本问题我们讨论过基于词典的分词和基于字的分词两大类,在浅谈分词算法(2)基于词典的分词方法文中我们利用n-gram实现了基于词典的分词方法.在(1)中,我们也讨论了这种方法有的缺陷,就是OOV的问题,即对于未登录词会失效在,并简单介绍了如何基于字进行分词,本文着重阐述下如何利用HMM实现基于字的分…
前言 在浅谈分词算法(1)分词中的基本问题我们讨论过基于词典的分词和基于字的分词两大类,在浅谈分词算法(2)基于词典的分词方法文中我们利用n-gram实现了基于词典的分词方法.在(1)中,我们也讨论了这种方法有的缺陷,就是OOV的问题,即对于未登录词会失效在,并简单介绍了如何基于字进行分词,本文着重阐述下如何利用HMM实现基于字的分词方法. 目录 浅谈分词算法(1)分词中的基本问题浅谈分词算法(2)基于词典的分词方法浅谈分词算法(3)基于字的分词方法(HMM)浅谈分词算法(4)基于字的分词方法(…
打算开始重新复习一遍相关算法.对于有向图tarjan算法,通过学习过很多说法,结合自己的理解,下面给出算法自己的观点. 算法总模型是一个dfs,结合一个stack(存放当前尚未形成SCC的点集合),记录下俩个数组: dfn[i]:结点i的访问时间戳. low[i]:i结点所能到达的祖先. 主要是俩次对low[u]的更新,一次:回溯的时候,u的孩子结点(vv)对u的更新, if(low[vv]<low[u])low[u]=low[vv]; //孩子可以到达,我必然也可以到达. 二次: if(dfn…
首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解.网上解法颇多.时间复杂度也不尽同样,这里列述几种常见的解法. 解法一       通过枚举S的子串.然后推断该子串是否为回文.因为S的子串个数大约为latex=\dpi{100}&space;\fn_jvn&space;N^2"> \dpi{100}&space;\fn_jvn&space;N^2" title="…
KMP算法是众多优秀的模式串匹配算法中较早诞生的一个,也是相对最为人所知的一个. 算法实现简单,运行效率高,时间复杂度为O(n+m)(n和m分别为目标串和模式串的长度) 当字符串长度和字符集大小的比值很大时,KMP算法相对蛮力有着很大的优势 理解KMP算法,关键是理解其中的精髓——next[]数组. (统一起见,下文将目标字符串记作obj,将模式字符串记作pattern,这与后面的程序代码是一致的) 我们给一个字符串S定义一个next值,记作next(S),next(S)=n表示: (1)S的前…
写在前面: 今天有一场考试,考到了Big-O的知识点,考到了一道原题,原题的答案我记住了,但实际题目有一些改动导致答案有所改动,为此作者决定重新整理一下复杂度相关知识点 Efficiency and Complexity. 我觉得的学习Big-O之前有必要先了解一下以下这些知识,其中大部分翻译自我们老师的课件,也有一部分自己理解加入,如果有专业名词翻译错误欢迎指正! 时间复杂度与空间复杂度 在写程序的时候,我们通常需要判断某一个算法或者程序是否可以完成某一项任务.拿12306的铁路订票系统举例,…
聚类算法(K-means)目的是将n个对象根据它们各自属性分成k个不同的簇,使得簇内各个对象的相似度尽可能高,而各簇之间的相似度尽量小. 而如何评测相似度呢,采用的准则函数是误差平方和(因此也叫K-均值算法): 其中,E是数据集中所有对象的平方误差和,P是空间中的点,表示给定对象,mi为簇Ci的均值.其实E所代表的就是所有对象到其所在聚类中心的距离之和.对于不同的聚类,E的大小肯定是不一样的,因此,使E最小的聚类是误差平方和准则下的最优结果. 选取代表点用如下几个办法: (1)凭经验.根据问题性…
了解LR的同学们都知道,LR采用了最小化交叉熵或者最大化似然估计函数来作为Cost Function,那有个很有意思的问题来了,为什么我们不用更加简单熟悉的最小化平方误差函数(MSE)呢? 我个人理解主要有三个原因: MSE的假设是高斯分布,交叉熵的假设是伯努利分布,而逻辑回归采用的就是伯努利分布: MSE会导致代价函数$J(\theta)$非凸,这会存在很多局部最优解,而我们更想要代价函数是凸函数: MSE相对于交叉熵而言会加重梯度弥散. 这里着重讨论下后边两条原因. 代价函数为什么要为凸函数…
模式串匹配,顾名思义,就是看一个串是否在另一个串中出现,出现了几次,在哪个位置出现: p.s.  模式串是前者,并且,我们称后一个 (也就是被匹配的串)为文本串: 在这篇博客的代码里,s1均为文本串,s2均为模式串: 一般地,文本串长度不小于匹配串:(否则无意义) 很显然可以得到一个暴力的做法 : ~lenth_of_s1 {//枚举匹配串在文本串中的开始位置 ~lenth_of_s2 ]) break; if j>lenth_of_s2 //在循环结束前没有break output : i }…
一.介绍 烤馍片KMP算法是用来处理字符串匹配问题的.比如说给你两个字符串A,B,问B是不是A的子串? 比如,eg就是aeggx的子串 一般讲字符串A称为主串,用来匹配的B串称为模式串 定义n为字符串A的长度,m为字符串B的长度(m≤n) 如果用暴力枚举法,时间复杂度为O(NM) 而KMP算法的时间复杂度在最坏的情况下为O(N),十分搞笑高效 ↑如果看到这张图饿了,去吃饭,吃完饭再来学KMP 二.烤馍片的流程 step1:把馍片做出来(要想烤馍片,首先得有馍片可以烤) 假设A=“xzxzxqxz…
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  字符串算法2:Manacher算法 问题:给出字符串S(限制见后)求出最大回文子串长度 Subtask1  对于10%的数据 |S|∈(0,100] Subtask2  对于30%的数据|S|∈(0,5000] Subtask3 对于100%的数据|S|∈(0,11000000] Subtask1(10pts):最朴素的暴力 枚举字符串的所有子串,判断其是否回文,时间复…
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  [字符串算法3]KMP算法 Part1 理解KMP的精髓和思想 其实KMP我也不太懂..有可能会误人子弟qwq 好的吧现在开始 KMP处理这样一个问题: 给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 一般的博客都是讲述怎么怎么暴力匹配,然后再讲KMP算法,显然这样的安排是不合适的, 因为来看KMP的OIer基本上都是会暴力匹配的. 那…
http://blog.csdn.net/haidao2009/article/details/7514787 菜鸟最近开始学习machine learning.发现adaboost 挺有趣,就把自己的一些思考写下来. 主要参考了http://stblog.baidu-tech.com/?p=19,其实说抄也不为过,但是我添加了一些我认为有意思的东西,所以我还是把它贴出来了,呵呵. 一 Boosting 算法的起源 boost 算法系列的起源来自于PAC Learnability(PAC 可学习…
一.bitmap算法思想 32位机器上,一个整形,比如int a; 在内存中占32bit位,可以用对应的32bit位对应十进制的0-31个数,bitmap算法利用这种思想处理大量数据的排序与查询.  优点:1.运算效率高,不许进行比较和移位:2.占用内存少,比如N=10000000:只需占用内存为N/8=1250000Byte=1.25M.     缺点:所有的数据不能重复.即不可对重复的数据进行排序和查找. 比如:           第一个4就是           000000000000…
http://blog.csdn.net/xmu_jupiter/article/details/50936177 最近在写毕业论文,由于EM算法在我的研究方向中经常用到,所以把相关的资料又拿出来看了一下,有了一些新的理解与感悟.在此总结一下. EM算法即“期望极大算法”.学过机器学习的朋友都知道EM算法分两步:E步求期望,M步求极大.但是期望是求谁的期望,极大是求谁的极大呢?这里面其实有两种解读角度. “通俗”角度 通俗角度的话,求极大肯定是求似然函数的极大了,而且一般都是对数似然.我们一般解…
KMP算法 KMP算法是一种字符串匹配算法,他可以在O(n+m)的时间内求出一个模式串在另一个模式串下出现的次数. KMP算法是利用next数组进行自匹配,然后来进行匹配的. Next数组 Next数组表示一个前缀的最长proper的长度. 简单地讲,$S[1 \sim next[i]] = S[next[i]+1 \sim i] $. 循环节 一个字符串\(S\),若是由字符串\(P\)重复\(k(k>1)\)次形成的,则称字符串\(P\)是\(S\)的一个循环节.使\(k\)最大的循环节被称…
一.Stein算法过程及其简单证明 1.一般步骤: s1:当两数均为偶数时将其同时除以2至至少一数为奇数为止,记录除掉的所有公因数2的乘积k: s2:如果仍有一数为偶数,连续除以2直至该数为奇数为止: s3:用更相减损法(辗转相减法),即GCD(a,b)=GCD(a-b,b),或辗转相除法求出两奇数的最大公约数d: s4:原来两数的最大公约数即为d*k: 2.简单证明: s1:即为求出两数为2的幂次方的最大公因数k: s2:当化简后两数一奇一偶时,显然奇数是不含偶数因子的,那么另一化简后偶数的所…
很久以前就学过KMP,不过一直没有深入理解只是背代码,今天总结一下KMP算法来加深印象. 一.KMP算法介绍 KMP解决的问题:给你两个字符串A和B(|A|=n,|B|=m,n>m),询问一个字符串在另一个字符串中的每一次出现位置. 暴力:枚举长串中的每一个起点,然后一位一位判断是否与短串完全相同,枚举复杂度是O(n),比较的复杂度是O(m),总的时间复杂度是O(nm),时间复杂度比较差 引入两个定义: 1.匹配串(A):被匹配的长串. 2.模式串(B):在匹配串中每次找出现位置的短串. 在匹配…
最近在复习数据结构,学到了 KMP 算法这一章,似乎又迷糊了,记得第一次学习这个算法时,老师在课堂上讲得唾沫横飞,十分有激情,而我们在下面听得一脸懵比,啥?这是个啥算法?啥玩意?再去看看书,完全听不懂呀?总之,觉得十分懵比,课后去看了一些视频和博客,才慢慢有一点理解,学习不是一蹴而就的,需要脚踏实地的努力.过了三年,重新温习这个算法,似乎依旧不是很明白,理解得不够透彻,重新拾起课本和视频,认真学习这个算法. 1.KMP 算法简介 KMP 算法是由三位老前辈(D.E.Knuth,J.H.Morri…
Manacher manacher是一种\(O(n)\)求最长回文子串的算法,俗称马拉车(滑稽) 直接步入正题 首先可以知道的是:每一个回文串都有自己的对称中心,相应的也有自己的最大延伸长度(可以称之为"半径") 我们设\(rad[i]\)表示以\(i\)为中心的回文子串的半径,那么只需要知道所有的\(rad[i]\)就可以求出最长回文子串了 从\(1\)到\(n\)枚举\(i\),求解\(rad[i]\) 设当前已经求到了\(rad[k]\),设前\(k-1\)个数中\(rad[i]…
目录 前言 引入 算法概述 算法流程 正确性证明 代码实现 结语 前言 Johnson 和 Floyd 一样是用来解决无负环图上的全源最短路. 在稀疏图上的表现远远超过 Floyd,时间复杂度 \(O(nm\log m)\). 算法本身一点都不复杂(前提是你已经掌握了多种最短路算法),而且正确性很容易证明. 注意:全文多处引自SF dalao 的文章. 再次注意:模板题贴在这里,请熟读题面再看代码. 引入 想想求一个有 \(\leq 3000\) 个点和 \(\leq 6000\) 条边的有负权…
分治虽然是基本思想,但是OI中不会出裸分治让你一眼看出来,往往都是结合到找规律里面. 先来个简单的: 奇妙变换 (magic.pas/c/cpp) [问题描述]   为了奖励牛牛同学帮妈妈解决了大写中文数字的问题,牛牛妈妈特地抽出一个周末的时间带着牛牛来到梦幻儿童乐园游玩.   在游乐园,牛牛看到了一个非常有意思的游戏:游戏一开始,电脑屏幕上只有一个序列“A”,而后的每一次变化都把序列中的“A”变成“AB”,“B”变成“A”.游戏一直继续„„,最后屏幕上得到了序列“ABAABABAABAABAB…
运用Tarjan算法,求解图的点/边双连通分量. 1.点双连通分量[块] 割点可以存在多个块中,每个块包含当前节点u,分量以边的形式输出比较有意义. typedef struct{ //栈结点结构 保存边 int front; int rear; }BNode; BNode block_edge[MAXL]; int top; //栈指针,指向下一个空位 int num_block; //块计数 int b1,b2; //存储块中的边 辅助信息[全局变量] void add(int *top,i…
一.为什么要用URLEncoder 客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文. 而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址, 将网址中的非ASCII码内容转换成可以传输的字符 不会被编码的内容 1.大写字母A-Z 2.小写字母a-z 3.数字 0-9 4.标点符 - _ . ! ~ * ' (和 ,) 二.编码原理 1.将需要转换的内容(ASCII码形式之外的内容),用十六进制表示法转换出来,并在之前加上%开头 eg:  0…