算法

KMP算法

泄露秘密 提交于 2020-02-07 09:18:24
字符串匹配中经常会用到KMP算法。它求解的问题类型是:字符串匹配。给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置。 我们一般的做法是:将一个字符串(长度为n,模式串)放在另一个字符串(长度为m,主串)开始的位置,然后依次比较,如果有不匹配的字符,就将字符串往后移一位,然后依旧从头开始比较。直到找到完全匹配的位置,返回。遍历顺序从0到m-n,每次遍历,都要比较n(最多)次,所以复杂度近似为O(m*n); 而我们今天说的这个KMP算法,可以达到O(m+n)的复杂度。 算法基本思想:每次当匹配失败时,没有必要就移动一位,因为前面可能有已经匹配的字符了。如果模式串当前的字符存在公共前后缀,那么我可以对于每一个模式串事先计算出模式串的内部匹配信息,在匹配失败时最大的移动模式串,以减少匹配次数。 注意最长前缀: 是说以第一个字符开始,但是不包含最后一个字符 KMP有个next数组,用来存放模式串中内部的匹配信息。举个例子,比如模式串为 ababaca ,长度是7,所以next[0],next[1],next[2],next[3],next[4],next[5],next[6]分别计算的是 a , ab , aba , abab , ababa , ababac , ababaca 的相同的最长前缀和最长后缀的长度。由于 a , ab , aba ,

Java-GC-垃圾回收机制

夙愿已清 提交于 2020-02-07 06:15:28
Java垃圾回收机制 文章目录 Java垃圾回收机制 引言 GC概念 GC的区域 GC分析算法 再谈引用 堆内存回收 方法区回收 GC的时机 GC算法 标记清除 标记整理 复制算法 分代回收算法 垃圾回收器 1.Serial收集器 2. 并行收集器 2.1 ParNew 2.2 Parallel收集器 3. CMS收集器 4. G1收集器 总结回收器 GC机制的使用 引言 “两者之间存在一堵由内存分配与GC技术筑建起来的高墙,墙里面的人想出去,墙外面的人却想进来”。 理解GC机制,必须要对JAVA内存区域很熟悉,如果不熟悉JAVA内存区域,建议先看上一篇文章《Java内存区域》 GC概念 GC的区域 GC的对象 GC的时机 GC算法 GC执行器 GC的区域 JVM中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。 GC分析算法 引用计数算法 该算法已经废弃,如果两个垃圾对象互相引用,将发生内存泄漏。 可达性分析 从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。 在Java语言中,GC Roots包括:

机器学习:没有免费午餐定理(No Free Lunch Theorem)

谁说我不能喝 提交于 2020-02-07 04:55:12
思考 清风文学网 www.198200.com 机器学习中哪个算法好?哪个算法差呢? 下面两条线,哪个更好呢? 没有免费午餐定理 如果我们不对特征空间有 先验假设 ,则所有算法的平均表现是一样的。 假设我们的计算机只有两个存储单元,而且每个存储单元只能存储两个标签,一类是class1(圆圈),一类是class2(叉叉)。假设其中一个存储单元是圆圈,另一个存储单元未知,需要我们预测,预测的可能情况如下: 如果不对特征空间有假设,则可以认为这两种情况的概率差不多,也就意味着,我们无论选择预测哪个结果,成功的概率都是50%。 假设计算机的存储单元变成三个,情况变成如下: 如果不对特征空间有假设,则可以认为这四种情况的概率差不多。 三个存储单元的情况,以只两个存储单元的状态,预测第三个存储单元的结果如下: 存储单元更多的情况,"?"处应该是圆圈还是叉叉呢? 大多数人应该选择上面的"?"为圆圈,下面的“?”是叉叉,这样真的对吗?如果我们把圆圈定义成花瓣,叉叉定义成蜜蜂。上边的"?"恰好表示小蜜蜂在花瓣里,也是合理的。但是大多数算法却不这么做。 我们认为:特征差距小的样本更有可能是同一类 但是事实上,没有所谓的世界上最好的算法,只有公认的好方法(支持向量机、决策树、神经网络等) 如果这篇博客对你有用,点个赞再走呗~ 来源: CSDN 作者: 胖子依然6 链接: https://blog

[数据结构与算法]第6章 递归

偶尔善良 提交于 2020-02-07 02:28:41
个人博客文章地址 文章目录 6.1 递归需要遵守的重要规则 6.2 递归-迷宫问题 6.3 递归-八皇后问题(回溯算法) 6.1 递归需要遵守的重要规则 执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 方法的局部变量是独立的,不会相互影响, 比如n变量 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据. 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,死龟了:) 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。 6.2 递归-迷宫问题 说明: 小球得到的路径,和程序员设置的找路策略有关即:找路的上下左右的顺序相关 再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是有变化 测试回溯现象 思考: 如何求出最短路径? 代码实现: public class MiGong { public static void main ( String [ ] args ) { // 先创建一个二维数组,模拟迷宫 // 地图 int [ ] [ ] map = new int [ 8 ] [ 7 ] ; // 使用1 表示墙 // 上下全部置为1 for ( int i = 0 ; i < 7 ; i ++ ) { map

第三种最小生成树算法 Borůvka算法

馋奶兔 提交于 2020-02-07 02:15:15
第三种最小生成树算法 Borůvka算法 基本思路: 用定点数组记录每个子树的最近邻居。 对于每一条边进行处理: 如果这条边连成的两个顶点同属于一个集合,则不处理,否则检测这条边连接的两个子树,如果是连接这两个子树的最小边,则更新 (合并)。 作用: 那么中算法有什么用呢,Kruskal,prim算法不好吗?它们好是好,但在某些题目里面可能用第三种算法更加优。对于那些点数n是1e5级别,边数m却是 n 2 n^2 n 2 级别的图,但每个点的最小边能很快算出来的题,求最小生成树我们不可能存得下边。这时候Borůvka算法用处就体现了,因为它的空间复杂度只跟点数有关。 代码: struct node { int x , y , w ; } edge [ M ] ; int d [ N ] ; // 各子树的最小连外边的权值 int e [ N ] ; // 各子树的最小连外边的索引 bool v [ M ] ; // 防止边重复统计 int fa [ N ] ; int find ( int x ) { return x == fa [ x ] ? x : ( fa [ x ] = find ( fa [ x ] ) ) ; } void join ( int x , int y ) { fa [ find ( x ) ] = find ( y ) ; } int Boruvka (

基于区域的网络

谁说胖子不能爱 提交于 2020-02-07 02:06:26
基于区域的网络 R-CNN网络框架流程 : (1)原始图像经过选择性搜索(SS)算法提取出约2000个候选区域框。 (2)把所有候选框缩放到固定大小(如227*227) (3)候选框图像逐个通过CNN网络模型提取其特征。 (4)使用SVM分类器对CNN提取的特征进行分类 (5)通过线性回归算法对候选框位置进行微调(边框回归)。 R-CNN不足 : (1)重复计算量大,速度慢 (2)训练阶段步骤繁琐 (3)训练耗时且占用空间大 (4)候选框缩放丢失图像信息 SPP-Net网络框架流程 (1)原始图像经过选择性搜索(SS)算法提取出约2000个候选区域框 (2)原始图像通过卷积神经网络直到最后一层卷积层,获得特征图 (3)对选择性搜索(SS)算法提取到的候选框映射在特征图上,称其为特征图上的window。 (4)对每个window进行SPP操作,获得固定的特征向量传入后续的全连接层。 (5)对全连接层输出特征向量使用SVM进行分类,边框回归算法微调Bounding-box的位置与大小。 SPP-Net不足 : (1)训练阶段步骤繁琐 (2)训练耗时且占用空间大 Fast R-CNN网络框架流程 (1)原始图像经过选择性搜索(SS)算法提取约2000个候选区域 (2)将原始图像经过一次CNN网络,得到最后一次卷积层的特征图 (3)把候选区域投影到特征图上,经过RoI

浅谈如何学习数据结构与算法[@初学者]

自闭症网瘾萝莉.ら 提交于 2020-02-07 01:57:52
导语 所谓“数据结构”,一般来说是“数据结构与算法”,是NOIPer/NOIer、本科生、硕士生、程序员都会学的一门课程,是程序员的必修课。 数据结构为什么要学? 我们使用计算机,希望它能帮助我们解决各种各样的问题,但随着发展—— 我们希望它运行得更快, 希望它能处理更多数据,希望它做一些原本不可能的事情…… 计算机科学不断改变着这个世界,但代价可能是高昂的。 好的算法设计可以做得更好,而且可能很便宜;劣质的算法就不得不花费更高昂的代价。 事实上,我们可能认为提高算力就能忽略劣质算法的影响。诚然,我们也在努力提高计算机算力,但即使强如超级计算机,也无法挽救一个错误的算法。 希望很多人能正视这个问题,因为数据结构与算法真的值得学习。 学科基础 学习数据结构与算法不需要太多的基础知识,但需要你熟练掌握一门编程语言。 至少给你C/C++/Java/Python的代码你能看得懂,让你用自己熟练的编程语言能轻松实现,这样就很棒了。 至于二分查找、冒泡排序、数组之类的内容我觉得是一个刚刚入门计算机科学的孩纸就应该会的,所以就很基础,没啥可说的,该会,对吧?(比如你连冒泡排序都不会,你咋学快排啥的,对吧?) 最好有一些经验积累,我在学数据结构之前就能在一定程度上运用Java的集合框架,看过比如java.util.ArrayList啊,java.util.LinkedList这样的类的源码

c++ stl 已排序区间算法 两个已排序集合的差集set_difference、set_symmetric_difference使用方法

橙三吉。 提交于 2020-02-06 14:27:56
template < typename T > inline void PRINT_ELEMENTS ( const T & coll , const string & optcstr = "" ) { cout << optcstr ; for ( auto elem : coll ) { cout << elem << ' ' ; } cout << endl ; } int main ( ) { vector < int > a { 1 , 2 , 2 , 4 , 6 , 7 , 7 , 9 } ; deque < int > b { 2 , 2 , 2 , 3 , 6 , 6 , 8 , 9 } ; PRINT_ELEMENTS ( a , "a: " ) ; PRINT_ELEMENTS ( b , "b: " ) ; cout << "set_difference: " ; set_difference ( a . cbegin ( ) , a . cend ( ) , b . cbegin ( ) , b . cend ( ) , ostream_iterator < int > ( cout , " " ) ) ; cout << endl ; cout << "set_symmetric_difference: " ; set_symmetric

04 非对称加密

旧巷老猫 提交于 2020-02-06 12:41:01
非对称加密 1 简介 非对称加密算法 ,又称为 公开密钥加密算法 。它需要两个密钥,一个称为公开密钥 (public key),即公钥,另一个称为私有密钥 (private key),即私钥。因为加密和解密使用的是两个不同的密钥,所以这种算法称为非对称加密算法。 如果使用公钥对数据进行加密,只有用对应的私钥才能进行解密。 如果使用私钥对数据进行加密,只有用对应的公钥才能进行解密。 2 常见算法 2.1 RSA算法 RSA 加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA 是第一个能同时用于加密和数字签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被 ISO 推荐为公钥数据加密标准。 RSA 加密算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 2.2 ECC算法 ECC 也是一种非对称加密算法,主要优势是在某些情况下,它比其他的方法使用更小的密钥,比如 RSA 加密算法,提供相当的或更高等级的安全级别。不过一个缺点是加密和解密操作的实现比其他机制时间长 (相比 RSA 算法,该算法对 CPU 消耗严重)。 来源: CSDN 作者: JasBin2008 链接: https://blog.csdn.net/JasBin2008/article/details

Apriori算法(Python篇)

别等时光非礼了梦想. 提交于 2020-02-06 11:57:36
关联规则挖掘是数据挖掘中最活跃的研究方法之一, 最早是针对购物篮分析问题提出的,其目的是为了发现交易数据库中不同商品之间的联系规则,这些规则刻画了顾客购买行为模式,可以用来指导商家科学地安排进货,库存以及货架设计等。 而Apriori算法是第一个关联规则挖掘算法,也是最经典的算法。 以如下的场景为例,使用Python快速实现Apriori算法: 1.场景与需求 一家超市的业务数据库中有销售订单表如下: id为订单号,name为商品名称 来源: CSDN 作者: OMax 链接: https://blog.csdn.net/osvyxcbttw/article/details/104191941