算法

Java 字符串匹配的KMP算法

孤者浪人 提交于 2020-03-06 05:11:31
package Four ; import java . util . Scanner ; /*** * 字符型的kmp算法 * @author bai * 描述: * 给你一个文本串,再给你一个模式串, * 文本串中有多少个子串的模式串完全匹配 */ public class StringKmp { static int [ ] nextTable = new int [ 10000 ] ; public static void getNextTable ( String pattern ) { char [ ] patt = pattern . toCharArray ( ) ; int m = patt . length ; int j = 0 ; nextTable [ j ] = - 1 ; int i = nextTable [ j ] ; while ( j < m ) { if ( i == - 1 || patt [ j ] == patt [ i ] ) { i ++ ; j ++ ; nextTable [ j ] = i ; } else { i = nextTable [ i ] ; } } return ; } public static int KMP ( String text , String pattern ) { getNextTable (

快速幂取模算法

倖福魔咒の 提交于 2020-03-06 02:48:28
所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快、计算范围更大的算法,产生了快速幂取模算法。我们先从简单的例子入手:求a b modc 算法1.直接设计这个算法: int ans = 1; for(int i = 1;i<=b;i++) { ans = ans * a; } ans = ans % c; 缺点:这个算法存在着明显的问题,如果a和b过大,很容易就会溢出。 我们先来看看第一个改进方案:在讲这个方案之前,要先看这样一个公式:a b mod c = (a mod c) c mod c 于是不用思考的进行了改进: 算法2.改进算法: int ans = 1; a = a % c; //加上这一句 for(int i = 1;i<=b;i++) { ans = ans * a; } ans = ans % c; 读者应该可以想到,既然某个因子取余之后相乘再取余保持余数不变,那么新算得的ans也可以进行取余,所以得到比较良好的改进版本。 算法3.进一步改进算法: int ans = 1; a = a % c; //加上这一句 for(int i = 1;i<=b;i++) { ans = (ans * a) % c;//这里再取了一次余 } ans = ans % c;

算法分析:如何分析一个算法的效率好坏?

时光毁灭记忆、已成空白 提交于 2020-03-06 00:30:28
/*--> */ /*--> */ 什么是算法分析 当我们说算法分析的时候我们在说什么?(狭义的技术层面的定义): 算法分析指的是: 对算法在运行时间和存储空间这两种资源的利用效率进行研究。 即时间效率和空间效率。 时间效率指算法运行有多快; 空间效率指算法运行时需要多少额外的存储空间。 (时间效率也叫时间复杂度;空间效率也叫空间复杂度。) 在计算机时代早期,时间和空间这两种资源都是及其昂贵的。但经过半个多世纪的发展,计算机的速度和存储容量都已经提升了好几个数量级。 现在空间效率已经不是我们关注的重点了 ,但时间效率的重要性并没有减弱到这种可以忽略的程度。 所以,当我们分析一个算法的的时候,我们 只关注它的时间效率 。 算法分析通用思路: 当我们遇到一个算法时,我们可以用这样一个通用的思路去分析它: 1. 输入规模 首先第一步考虑这个算法的输入规模是什么?即输入参数,再换句话说也就是待解决的问题有多大? 从这里入手是因为一个显而易见的规律就是, 不管使用什么算法,输入规模越大,运行效率肯定会更长。 输入规模的确定要根据具体要解决的实际问题的细节来决定,相同的问题不同的细节,输入规模是不一样的。比如:一个拼写检查的算法, 如果算法关注的是单独的字符检查,那么字符的数量就是输入规模的大小; 如果算法关注的是词组搭配的检查,那么这个输入规模就要比单独的字符检查的输入规模要小

跨越算法开篇

对着背影说爱祢 提交于 2020-03-06 00:25:01
数据结构与算法是编程的基本功,当你算法掌握越来越深的时候你会发现写代码的时候,会不由自主考虑很多性能方面的问题。写出时间复杂度高、空间复杂度高的垃圾代码越来越少了,算法能力提升了很多,编程能力也有了质的飞跃。 首先一个三连问。 是不是从学校开始,你就觉得数据结构难学,然后一直没认真学? 工作中,一遇到数据结构这个坑,你又发自本能地迅速避让,因为你觉得自己不懂,所以也不想深究,反正看起来无关大局? 当你想换工作面试,或者研究某个开源项目源码,亦或者和团队讨论某个非框架层面的高可用难题的时候,你又发现,自己的基础跟不上别人的节奏? 如果你有这种情况,其实你并不孤独。这不是你一个人遇到的问题。工作十间,见过许多程序员。他们有着各种各样的背景,有很多既有潜力又非常努力,但始终无法在自己现有水平上更进一步。少年不要慌,青叶带你跨越算法这道坎。 在技术圈里,我们经常喜欢谈论高大上的架构,比如高可用、微服务、服务治理等等。鲜有人关注代码层面的编程能力,而愿意沉下心来,花几个月时间啃一啃计算机基础知识、认认真真夯实基础的人,简直就是凤毛麟角。 基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位 。 那技术人究竟都需要修炼哪些“内功”呢?我觉得,无外乎就是大学里的那些基础课程,操作系统、计算机网络、编译原理等等

解密滴滴派单算法

天涯浪子 提交于 2020-03-06 00:13:37
导读:说到滴滴的派单算法,大家可能感觉到既神秘又好奇,从出租车扬召到司机在滴滴平台抢单最后到平台派单,大家今天的出行体验已经发生了翻天覆地的变化,面对着每天数千万的呼叫,滴滴的派单算法一直在持续努力让更多人打到车,本篇文章会着重介绍我们是如何分析和建模这个问题,并且这其中面临了怎样的算法挑战,以及介绍一些我们常用的派单算法,这些算法能够让我们不断的提升用户的打车确定性。 1. 为什么我们需要更好的派单算法 说到滴滴的派单算法,大家可能感觉到既神秘又好奇,从扬召到抢单到派单,我们又是如何演进到今天大家的打车体验的呢,我们首先来看一看,好的派单算法为什么是出行行业不可或缺的能力? 回想几年前,当我们还没有滴滴的时候,只能在寒风或者酷暑中等待可能有、可能没有的扬招出租车,到后来可以从滴滴上呼叫一辆出租车,乘客可以在室内相对舒适的等待车辆的到达,从线上到线下,乘客的确定性得到第一次的提升,然而这还不够,抢单的模式注定我们的应答率天花板不会太高,在15年,滴滴上线快车业务,我们从抢单演进到了派单模式,乘客的应答率有了20个点以上的提升,很多时候能够全天能够高达90+(高峰&局部供需紧张应答率会相对吃紧),乘客确定性再一次得到大幅的提升,由此可见,派单模式为滴滴创造了巨大用户价值。 再看近年来不断兴起的O2O业务,从国内外的网约车公司,包括我们的友商Uber

机器学习复习6-优化器等

扶醉桌前 提交于 2020-03-05 23:16:52
预备知识 一、正定和半正定矩阵 半正定矩阵包括了正定矩阵 。 不定矩阵:特征值有正有负 半正定 矩阵: 所有特征值为 非负 。 半负定矩阵:所有特征值为非正。 二、牛顿法和拟牛顿法(二阶优化方法) 由于我主要是做NLP,机器学习方面基本功扎实后,更加偏机器学习的方法浅尝辄止即可, 面试的时候知道有这些东西即可。这里只提一提。 牛顿法(Newton method)和拟牛顿法(quasi Newton method)是 求解无约束最优化问题的常用方法 ,有收敛速度快的优点。 牛顿法是迭代算法,每一步都需求解目标函数的海塞矩阵 (Hessian Matrix),计算比较复杂。 拟牛顿法通过正定矩阵近似海塞矩阵的逆矩阵或海塞矩阵 ,简化了这一计算过程。 1 牛顿法 : 2 拟牛顿法 : 拟牛顿法主要常见有DFP法(逼近Hession的逆)、BFGS(直接逼近Hession矩阵)、 L-BFGS(可以减少BFGS所需的存储空间)。均是用不同的构造方法来近似海塞矩阵或其逆。 3 牛顿法和梯度下降法 : 4 牛顿法和深度学习 : 三、海塞矩阵 四、鞍点问题 高维非凸优化问题之所以困难,是因为 存在大量的鞍点而不是局部极值 。 神经网络优化问题中的 鞍点即一个维度向上倾斜且另一维度向下倾斜的点 。 鞍点和局部极值的区别: 鞍点和局部极小值, 相同 的是,在该点处的 梯度都等于零 , 不同在于

【数据结构和算法】_09_广度 / 深度 优先搜索

a 夏天 提交于 2020-03-05 23:11:50
文章目录 【一】 Breadth - First Search (广度优先搜索) 【二】 Depth - First Search (深度优先搜索) 【三】 Interview (面试题) 【3.1】 LeetCode 102:Binary Tree Level Order (二叉树的层次遍历) 【3.2】 LeetCode 104:Max depth (二叉树的最大深度) 【3.3】 LeetCode 111:Min depth (二叉树的最小深度) 【3.4】 LeetCode 22:Generate Parentheses (括号生成) 【一】 Breadth - First Search (广度优先搜索) 比较符合人类的思维的,常用的,搜索算法,必须掌握 示意图( 树 ) 代码 (不仅适用于树,也适用于图) # python 广度优先搜索 def BFS ( graph , start , end ) : # 队列,先进先出 queue = [ ] queue . append ( [ start ] ) # visited 里的数据表示被访问过了 (对二叉树来说没必要) visited . add ( start ) # 当队列不为空时 while queue : # 将队列头元素取出 node = queue . pop ( ) # 放进被访问过的列表里 visited

【数据结构与算法之美】排序优化:如何实现一个通用的、高性能的排序函数?

我与影子孤独终老i 提交于 2020-03-05 22:04:21
目录 一、如何选择合适的排序算法? 1.排序算法一览表 2.为什选择快速排序? 二、如何优化快速排序? 三、通用排序函数实现技巧 四、课后思考 一、如何选择合适的排序算法? 1.排序算法一览表 时间复杂度 是稳定排序? 是原地排序? 冒泡排序 O(n^2) 是 是 插入排序 O(n^2) 是 是 选择排序 O(n^2) 否 是 快速排序 O(nlogn) 否 是 归并排序 O(nlogn) 是 否 桶排序 O(n) 是 否 计数排序 O(n+k),k是数据范围 是 否 基数排序 O(dn),d是纬度 是 否 2.为什选择快速排序? 1)线性排序时间复杂度很低但使用场景特殊,如果要写一个通用排序函数,不能选择线性排序。 2)为了兼顾任意规模数据的排序,一般会首选时间复杂度为O(nlogn)的排序算法来实现排序函数。 3)同为O(nlogn)的快排和归并排序相比,归并排序不是原地排序算法,所以最优的选择是快排。 二、如何优化快速排序? 导致快排时间复杂度降为O(n)的原因是分区点选择不合理,最理想的分区点是:被分区点分开的两个分区中,数据的数量差不多。如何优化分区点的选择?有2种常用方法,如下: 1.三数取中法 ①从区间的首、中、尾分别取一个数,然后比较大小,取中间值作为分区点。 ②如果要排序的数组比较大,那“三数取中”可能就不够用了,可能要“5数取中”或者“10数取中”。 2.随机法

机器学习算法理论及实战(一)——KNN算法

百般思念 提交于 2020-03-05 21:06:04
目录: 一、介绍 二、工作流程 三、示例 四、用Python实现 1.模拟数据及绘图 2.KNN过程 3.使用scikit-learn中的KNN 五、KNN的优缺点 1.优点 2.缺点 六、KNN的应用 1.银行系统 2.计算信用等级 3.政治 4.其他领域 一、介绍 K最近邻(KNN)算法是一种监督的ML算法,可用于分类以及回归预测问题。但是,它主要用于行业中的分类预测问题。以下两个属性将很好地定义KNN: 惰性学习算法 :因为它没有专门的训练阶段,并且在分类时将所有数据用于训练。 非参数学习算法 :因为它不假设有关基础数据的任何信息 。 二、工作流程 K最近邻(KNN)算法使用“特征相似性”来预测新数据点的值,这意味着,将根据新数据点与训练集中的点的匹配程度为该新数据点分配一个值。我们可以通过以下步骤了解其工作方式: 步骤1: 加载训练以及测试数据。 步骤2: 选择K的值,即最近的数据点(K可以是任何整数)。 步骤3: 对于测试数据中的每个点,请执行以下操作: 借助以下任意一种方法来计算测试数据与训练数据的每一行之间的距离: 欧几里得距离,曼哈顿距离或汉明距离 。 最常用 的距离计算方法是欧几里得。 基于距离值,将它们按升序排序。 然后它将从排序后的数组中选择前K行。 现在,它将基于这些行中最多出现的类别为测试点分配这一个类。 步骤4: 结束。 三、示例

告警压缩与降噪

旧街凉风 提交于 2020-03-05 18:37:23
为何要压缩告警? 运维监控工具/平台,一般是通过配置固定阈值,达到阈值后自动触发/生成告警。如网络中断、闪断;系统升级更新;设备多监控内容多等情况下,更会产生海量告警。以下为告警管理常见问题: 故障期间,告警风暴,手机/邮箱会被海量告警淹没; 运维人员很难从海量告警从筛选出重要告警,容易忽略重要告警; 固定阈值控制,频繁误报、漏报告警; 如何实现告警压缩与降噪? 睿象云智能告警平台 Cloud Alert (后文为:CA)适应不同行业、不同规模、不同运维水平公司的各种告警需求,平台支持多维度告警压缩合并与降噪,帮助您在不遗漏重要告警前提下,快速减少告警。 CA实现告警降噪根据降噪程度不同,分为事前和事后共三种方式: 事前:也就是影响告警通知的方式; 事后:不影响告警通知的方式,可以用作事后分析判断。 1.自动去重压缩;(事前) 2.规则压缩;(事前) 3.算法智能降噪(事后) 自动去重(事前) 全量告警推送到CA平台后,CA平台会自动基于时间序列,将相同的事件/告警压缩。不同监控工具去重压缩机制有细微差异:根据 eventId(事件ID)和告警对象,去除重复告警。 规则压缩(事前) 自动去重后的告警,会按照压缩规则,将相似、同源(同一设备不同类型的信息)告警再次进行压缩。一共分为两种压缩机制,分别是: 1.算法智能降噪 2.自定义压缩规则降噪 算法智能降噪