算法

Manachar算法详解

╄→尐↘猪︶ㄣ 提交于 2020-02-25 18:13:55
求解最长回文串之Manachar算法 问题类型: 输入一个字符串,求出其中最大的回文子串。子串的含义是:在原串中连续出现的字符串片段。 回文的含义是:正着看和倒着看相同,如abba和yyxyy。 这类问题对于一些小数据可以暴力枚举回文的中心点求解(处理好奇数和偶数长度的回文即可) 但是时间复杂度较高 利用manachar算法可以在O(n)时间内得到正确的答案 算法基本要点:      首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:      在每个字符的两边都插入一个特殊的符号。比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#。      为了进一步减少编码的复杂度,可以在字符串的开始加入另一个特殊 字符,这样就不用特殊处理越界问题,比如$#a#b#a#。 下面以字符串12212321为例,经过上一步,变成了 S[] = "$#1#2#2#1#2#3#2#1#"; 然后用一个数组 P[i] 来记录以字符S[i]为中心的最长回文子串向左/右扩张的长度(包括S[i]),比如S和P的对应关系: S # 1 # 2 # 2 # 1 # 2 # 3 # 2 # 1 # P 1 2 1 2 5 2 1 4 1 2 1 6 1 2 1 2 1 (p.s. 可以看出,P[i]-1正好是原字符串中回文串的总长度) 如何得到p数组嘞?

Google最近三十天的搜索算法变化

限于喜欢 提交于 2020-02-25 17:42:29
来自David Yin消息:Google发布广泛的核心算法更新,每年都有的被命名为 January 2020 Core Update。在之后的几天,此更新就同步到 Google 全球的数据中心了。通常此类核心更新的完全完成并生效,大致需要两周的时间。 在同一天,也是十三日,Google 宣布,去年也就是2019年在移动设备上所使用的新界面,会在桌面上采用。主要的就是会在搜索结果中,显示域名,以及知名品牌的图标,以及粗体显示的 Ad 标志。样例如下。 对于站长来说,网站图标的规范制作就很重要,请参考这里的 Google 说明。 关于排名来说,结构化数据是作为一种选项提供给 Google 的搜索,以加强网页的显示,并没有对排名有影响。只会对显示的结果有所改变,使其对于用户来说更加吸引人。这是 Google 的说法,在 DavidYin看来,没有直接影响,也会有间接的影响,比如搜索结果更加吸引人点击,那么点击率的提高也会影响排名。 在 Google 搜索结果中,首页的十个结果是不会有重复的。而在第二页,就有可能发生重复。 有关百度的没有可以说明的。 作者:卢松松 来源:卢松松博客,欢迎分享 来源: 51CTO 作者: wx5c7e33e5878de 链接: https://blog.51cto.com/14226418/2470047

垃圾回收算法

社会主义新天地 提交于 2020-02-25 17:30:24
四种垃圾回收算法:标记清除算法、标记复制算法、标记整理算法、分代收集算法。 标记清除算法 将需要被回收的对象进行标记,然后回收,缺点是会有很多内存碎片。 标记复制算法 将内存分成两部分,其中一块内存空着。将回收后存活的对象复制到另外一块上,然后将原来那块清空。这样可以避免了标记清除算法的内存碎片问题,但是太浪费空间。 标记整理算法 将需要被回收的对象进行标记,然后回收,再将剩余存活的对象进行整理,这样避免了内存碎片的问题。 分代收集算法 根据生命周期长短,分成年轻代、老年代、永久代,再根据各自的特点选用不同的算法。 来源: oschina 链接: https://my.oschina.net/Oaki/blog/3171046

从结构到性能,一文概述XGBoost、Light GBM和CatBoost的同与不同

ⅰ亾dé卋堺 提交于 2020-02-25 15:48:18
尽管近年来神经网络复兴并大为流行,但是 boosting 算法在训练样本量有限、所需训练时间较短、缺乏调参知识等场景依然有其不可或缺的优势。本文从算法结构差异、每个算法的分类变量时的处理、算法在数据集上的实现等多个方面对 3 种代表性的 boosting 算法 CatBoost、Light GBM 和 XGBoost 进行了对比;虽然本文结论依据于特定的数据集,但通常情况下,XGBoost 都比另外两个算法慢。 最近,我参加了 kaggle 竞赛 WIDS Datathon,并通过使用多种 boosting 算法,最终排名前十。从那时开始,我就对这些算法的内在工作原理非常好奇,包括调参及其优劣势,所以有了这篇文章。尽管最近几年神经网络复兴,并变得流行起来,但我还是更加关注 boosting 算法,因为在训练样本量有限、所需训练时间较短、缺乏调参知识的场景中,它们依然拥有绝对优势。 2014 年 3 月,XGBOOST 最早作为研究项目,由陈天奇提出2017 年 1 月,微软发布首个稳定版 LightGBM2017 年 4 月,俄罗斯顶尖技术公司 Yandex 开源 CatBoost 由于 XGBoost(通常被称为 GBM 杀手)已经在机器学习领域出现了很久,如今有非常多详细论述它的文章,所以本文将重点讨论 CatBoost 和 LGBM,在下文我们将谈到:

面对海量的数据,我们应该如何处理?

这一生的挚爱 提交于 2020-02-25 15:25:23
一、海量数据处理 所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就 是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导 致无法一次性装入内存。 那解决办法呢? 针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit- map/堆/trie树。 针对空间,无非就一个办法:大而化小,分而治之(hash映射)。 相关内容后续GitHub更新 ( 顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找 ) https://github.com/xiangjiana/Android-MS (VX:mm14525201314) 二、算法/数据结构基础 1.Bloom Filter Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地 表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在 集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判断。也 就是Bloom Filter判断元素不再集合,那肯定不在。如果判断元素存在集合中,有一 定的概率判断错误。因此,Bloom Filter不适合那些“零错误”的应用场合。 而在能容忍低错误率的应用场合下,Bloom Filter比其他常见的算法(如hash,折 半查找

比KMP更快的字符串匹配算法——BM算法

拜拜、爱过 提交于 2020-02-25 14:45:13
引言: KMP的时间复杂度是O(n+m)的 但实际上如果无法匹配成功,这个复杂度一般都是能跑满的 linux下常用的grep就用到了字符串匹配算法,但是使用了更快的BM算法 它的理论时间复杂度也是O(n+m)的,但无论能不能匹配成功,一般它都是跑不满的 也就是它实际对比的字符数量一般都是比(n+m)少很多的,所以用起来平均速度能比KMP快几倍 而最坏时间复杂度也是有保障的 原理: 考虑O(nm)的暴力对比进行字符串匹配,我们总是希望某次失配后能根据已有信息进行尽可能多的跳跃 KMP有自己的next数组来进行跳跃 BM呢?最朴素的,我们有坏字符规则 问题:我们要在长度为n的串s中找到长度为m的串t(下标均从0开始) 坏字符规则: 我们首先预处理出所有字符在t中最后一次出现的位置last-occurence 定义last[i]为字符i最后一次在t中出现的位置,可以O(m)得到last数组 我们从前往后枚举s的下标,确定某个位置后,我们从后往前枚举串t的字符,即 for i in [(m - 1) -> n]:   for j in [(m - 1) -> 0]:     ... 这样进行匹配,当j匹配到某个位置失配,那么可以直接向后移动last[] 来源: https://www.cnblogs.com/ytytzzz/p/11250277.html

机器学习算法之LightGBM

南楼画角 提交于 2020-02-25 13:00:33
这篇文章我们继续学习一下 GBDT 模型的另一个进化版本:LightGBM。LigthGBM是boosting集合模型中的新进成员,由微软提供,它和XGBoost一样是对GBDT的高效实现,原理上它和GBDT及XGBoost类似,都采用损失函数的负梯度作为当前决策树的残差近似值,去拟合新的决策树。 LightGBM在很多方面会比XGBoost表现的更为优秀。它有以下优势: 更快的训练效率 低内存使用 更高的准确率 支持并行化学习 可处理大规模数据 支持直接使用category特征 从下图实验数据可以看出, LightGBM比XGBoost快将近10倍,内存占用率大约为XGBoost的1/6,并且准确率也有提升。 看完这些惊人的实验结果以后,对下面两个问题产生了疑惑:XGBoost已经十分完美了,为什么还要追求速度更快、内存使用更小的模型?对GBDT算法进行改进和提升的技术细节是什么? 提出LightGBM的动机 常用的机器学习算法,例如神经网络等算法,都可以以mini-batch的方式训练,训练数据的大小不会受到内存限制。而GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的GBDT算法是不能满足其需求的。

CRC冗余校验算法&&MTU

余生长醉 提交于 2020-02-25 00:44:40
一、CRC冗余校验算法 CRC原理: 先选择一个用于在接收端进行校验时,对接收的贞进行除法运算的除数 看所选定的除数的二进制位数(假定为K位),然后要在要求发送的数据帧后面加上K-1位0,然后这个加了K-1位0的新帧中,以模2除法的方式,除以上面这个除数,所得到的系数就是该帧的CRC校验码。 把这个校验码附在源数据帧的后面(不是加0以后的),构建一个新帧发送到接收端,在接收端以“模2除法”方式除以前面的除数,如果可以整除,说明传输过程无差错。 二、路由表项的内容 目的地址:用在标示IP包的目的地址或则目的网络 mask网络掩码:与目的地址一起标示目的主机或者路由器所在的网段的地址。 pre:标示路由加入IP路由表的优先级,可能到达一个目的地有多条路由,但是优先级的存在让他们按照优先级高的路由进行利用。 cost:路由开销,当到达一个目的的多个路由优先级相同时,路由开销最小的将成为最优路由 interface: 输出接口,说明IP包将从路由器的那个端口被转发出去 nextop:下一跳的IP地址,说明IP包所经过的下一个路由器。 三、什么是MTU什么是路径MTU MTU:最大传输单元->指一中通信协议的某一层上所能通过的最大数据包的大小。 路径MTU:指一条因特网传输路径中,从源地址到目的地址所经过的所有路径上,所有IP路的MTU的最小值(就是无需分片就能通过

初学算法——梯度下降法

和自甴很熟 提交于 2020-02-24 23:59:52
梯度下降算法 注: :=是赋值的意思 右边错误是因为temp1中采用了更新后的θ0,而梯度下降算法中要求的是同时更新;右边是另外一种算法 α太大,可能会导致不收敛 线性代数知识: 矩阵的加减乘除算法、单位矩阵、逆矩阵运算、矩阵的转置定义相关知识 特征缩放法 目的:加快梯度下降算法的收敛速度。 问题描述:如上左图,如果取值θ1=(0 ,5),θ2=(0,2000),则代价函数的2D图会如左图所示,很狭长,在用梯度下降算法寻找最小值的路线可能是弯弯曲曲,需要废掉很长的时间; 当我将θ1,θ2取值分别除以他的取值长度5,2000后,得到的取值范围再画2D图(上右图),则寻找收敛值得曲线会是趋向于一条直线,故这样会大大加快收敛得速度 注:缩放之后的值不能太小,也不能太大;经验值:(-3,3)之间都能接受。 均值归一化 目的:加快梯度下降算法的收敛速度 注: 不同的人算出来的范围可能有出入,但是这并不影响最终结果,这些方法只是为了加快收敛速度。 调整学习率α值 如果代价函数出现了下面这种情况,那么很有可能是学习率α取值太大引起的;(确保编程没有错误的情况下) 适当的学习率值,对于寻找收敛值很关键; 太大,可能出现不收敛; 太小,会出现收敛过慢; 所以再学习之前先做一系列的收敛测试,选择一个收敛中的最大的α值进行学习 来源: CSDN 作者: YUE.YUN 链接: https://blog

C数据结构与算法-基础整理-栈和队列-02:队列的基础操作

若如初见. 提交于 2020-02-24 20:27:18
0x01.关于队列 队列是一种先进先出的数据结构,有入队(EnQueue)和出队(DeQueue)操作。因为数据的存放取出存在优先级的,所有广泛用于各种算法。 队列同样要注意队头指针和队尾指针。 关于循环队列,主要要知道判满与计算长度的数学思想。 0x02.基础数组队列 #define SIZE 50 typedef struct { int data[SIZE]; int head; int tail; }QUEUE; QUEUE Q; void iniqueue() { Q.head = 0; Q.tail = 0; return; } void EnQueue(int m) { if (Q.tail >= SIZE) { printf("队列已满,无法加入元素!!!"); return; } Q.data[Q.tail++] = m; return; } void DeQueue() { if (Q.tail == Q.head) { printf("队列为空,无法取出元素!!!"); return; } int m = Q.data[Q.head++]; printf("队列头元素 %d 已取出!!!\n", m); return; } 0x03.循环队列 由来:普通的队列用着用着,很多的空间就被浪费掉了,循环队列使得队尾可以不断的循环移动,充分利用了空间。 #define