数组公式

KMP模板匹配算法——六步搞定KMP

◇◆丶佛笑我妖孽 提交于 2020-02-27 15:11:31
KMP算法——六步搞定KMP 1.什么是KMP KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位大佬共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 模板匹配算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,提高时间效率。(空间换时间) 2.KMP与朴素模板匹配(Brute-Force) 暴力法Brute-Force 这个就是超级简单的逐一遍历比较。。。。 给定字串 S,T , 将 T 与 S 的第一个 长度与T 一样的字串比较,成功就返回匹配的第一个索引 不成功,则继续匹配 S 的下一个 长度与T 一样的字串 ……重复遍历每一个长度与 T 一样的字串,并匹配 这样的时间复杂度是O(n*m)。 KMP模板匹配算法——可以实现复杂度为O(m+n) 第一步:先了解什么是前缀后缀字串 比如: abcjkdabc,那么这个数组的最长前缀和最长后缀相同——必然是abc。 cbcbc,最长前缀和最长后缀相同——是cbc。 abcbc,最长前缀和最长后缀相同,是不存在的。 注意最长前缀:是说以第一个字符开始,但是不包含最后一个字符。 第二步,理解关于字符串匹配的规则 假设 S与T要进行匹配 ,匹配规则如图 这里aba就是最长前缀字串,然后下一次a是最长前缀字串 借别人的图示意:

js基础知识点

我们两清 提交于 2020-02-27 07:11:13
1. 变量声明: var 变量名; J avaScript基础数据类型 包括原始类型和引用类型 原始类型有5个: Number(数值) String(字符串) Boolean(布尔) Null(空) Undefined(未定义) 引用类型有1个: Object(对象) 通过typeof(x)可以返回一个变量x的数据类型; 注意一点:typeof运算符对于null类型返回的是object 2.函数 1.函数:函数就是可以重复执行的代码块。 2.语法:function 函数(){} 3.调用:函数定义了,一定要调用 4.形参,实参,实参写在调用函数的括号里,实参写在定义函数括号里 5,返回值 return 返回值返回了要接收,接受的是调用函数。 6,Js不能重载(就是两个函数名相同,下面的函数会把上面的函数覆盖) 7.匿名函数 function(){} 没有函数名,一般要与变量或者事件结合起来使用 8.作用域:全局变量,局部变量。 局部变量只能在函数内部使用。代码执行完,定义的变量也就消失了。 全局变量可以在任何地方使用。 3.循环 ① while循环 while用于循环作用基本一致,通常用来循环数组 语法:while(条件){循环体} ②  do while循环,do while 是while的一个亲戚,它在循环开始前先执行一次操作,然后才进行判断,true就继续执行

带你逐行分析 HashMap 源码

邮差的信 提交于 2020-02-26 23:46:23
带你逐行分析 HashMap 源码 一、写在前面 相信读者也看过了不少讲解 HashMap 源码的文章了,笔者认为,一切脱离源码去讲原理的都是泛泛而谈。一些所谓的原理大都是阅读源码之后的个人概括,这些概括参差不齐,再加上没有阅读源码,读者们是很难有切身体会的。正因如此,笔者逐行分析了 HashMap 的源码后,开启了本场 Chat。 笔者在阅读 HashMap 源码的时候,曾对每个内部属性,每个内部方法和方法调用逻辑做了简要注释,但在整理成文的时候,还是遇到了略微的困难。对于一些内部属性的解释,需要结合它在一些方法的使用中发挥的作用来综合说明,笔者打算按照从浅到深的顺序,先带读者熟悉 HashMap 的宏观设计思想,再通读一遍源码,然后讲解源码的设计细节。要让读者边看文字边对照源码进行学习,形成自己的领悟和体会,避免造成笔者一人的泛泛而谈。 无论自己的领悟是深是浅,终归是自己的,无论别人的领悟多么高深,那也是别人的。希望每个读者都能有自己的收获和体会。 Java 版本 $ java -version java version "1.8.0\_211" Java(TM) SE Runtime Environment (build 1.8.0\_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed

返回一个整数数组中最大子数组的和(1)

纵饮孤独 提交于 2020-02-26 18:48:41
题目要求: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n) 发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。 设计思想及代码和结果截图: 1.最开始的想法很简单,使用穷举法。我们列出所有的子数组之和,然后取出其中的最大值,代码如下: public static void main(String[] args) { int [] a = {1,-2,3,10,-4,7,2,-5}; int maxsofar = 0; int sum = 0; //进入循环 for(int i=0;i<8;i++) { sum=0; //每次求出一个子数组的和就和目前的最大值进行比较 for(int j=i;j<8;j++) { sum+=a[j]; maxsofar = Math.max(maxsofar, sum); } } System.out.println(maxsofar); } 运行结果如图: 可以看到,结果是正确的,但这个的时间复杂度为O(n2),明显超出了我们题目要求的O(n),通常最直观的算法是最慢的,我们接着使用别的算法。 2.之后,意识到老师提出的动态规划算法,于是在网上查阅了相关资料,发现了Kadane算法

干货:图解算法——动态规划系列

霸气de小男生 提交于 2020-02-25 19:47:12
小浩:宜信科技中心攻城狮一枚,热爱算法,热爱学习,不拘泥于枯燥编程代码,更喜欢用轻松方式把问题简单阐述,希望喜欢的小伙伴可以多多关注! 动态规划系列一:爬楼梯 1.1 概念讲解 讲解动态规划的资料很多,官方的定义是指把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。概念中的各阶段之间的关系,其实指的就是状态转移方程。很多人觉得DP难(下文统称动态规划为DP),根本原因是因为DP区别于一些固定形式的算法(比如DFS、二分法、KMP),没有实际的步骤规定第一步第二步来做什么,所以准确的说,DP其实是一种解决问题的思想。 这种思想的本质是:一个规模比较大的问题(可以用两三个参数表示的问题),可以通过若干规模较小的问题的结果来得到的(通常会寻求到一些特殊的计算逻辑,如求最值等) 所以我们一般看到的状态转移方程,基本都是这样: opt :指代特殊的计算逻辑,通常为max or min。 i,j,k 都是在定义DP方程中用到的参数。 dp[i] = opt(dp[i-1])+1 dp[i][j] = w(i,j,k) + opt(dp[i-1][k]) dp[i][j] = opt(dp[i-1][j] + xi, dp[i][j-1] + yj, ...) 每一个状态转移方程,多少都有一些细微的差别。这个其实很容易理解,世间的关系多了去了,不可能抽象出完全可以套用的公式

数据结构之数组

僤鯓⒐⒋嵵緔 提交于 2020-02-25 17:13:19
文章来源: http://blog.seclibs.com/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e4%b9%8b%e6%95%b0%e7%bb%84/ 在说数组之前咱们先明确两个概念,什么是 线性表 ,什么是 非线性表 顾名思义,线性表就是把数据排成一条,每个数据只有前后两种情况,常见的线性表有 数组、链表、队列、栈 等 那非线性表就更好理解了,数据不是按照一条线来排列的,每个数据并不只有前后两个方向,常见的有 二叉树、堆、图 等 明白了这个概念之后,咱们再来说数组,什么是数组? 数组不仅是大多数编程语言中的一个数据类型,它更是一个最基础的数据结构。 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 关于线性表前面已经说过了,接下来说具有连续的内存空间、存储相同类型的数据,也正是因为这一点才使数组有了 随机访问 的特性。 我们拿下面这个例子来进行说明,有一个长度为10的int类型的数组,我们给它分配一块连续内存空间 1000~1039,内存块的首地址为1000 当我们需要访问其中的数据的时候,计算机会先通过一个寻址公式来找到内存地址,然后再读取其中的数据。 在数组中我们使用的寻址公式为 a[i]_address = base_address + i * data_type_size base

三步学通KMP

痴心易碎 提交于 2020-02-24 03:16:02
前言 谈到字符串模式匹配算法,莫过于最经典的KMP算法,它由D.E.Knuth,J.H.Morris和V.R.Pratt三位大牛于1977年联合发表提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法),KMP算法可以在O(n+m)的时间复杂度以内完成字符串的匹配操作,其核心思想在于:当一趟匹配过程中出现字符不匹配时,不需要回溯主串的指针,而是利用已经得到的“部分匹配”,将模式串尽可能多地向右“滑动”一段距离,然后继续比较。 说到KMP,也得需要提一下字符串的模式匹配的意义,这也是我们学习KMP及各种字符串匹配算法的意义。字符串的模式匹配是对字符串的基本操作之一,广泛应用于生物信息学、信息检索、拼写检查、语言翻译、数据压缩、网络入侵检测等领域,如何简化其复杂性一直是算法研究中的经典问题。字符串的模式匹配实质上就是寻找模式串T是否在主串S 中,及其出现的位置。由于对字符串匹配的效率要求越来越高, 所以需要不断地改良模式匹配算法,减少其时间复杂度。 说到KMP,也感觉到数学世界的美妙,我们的祖先早在2000多年前就用阴阳(0,1)虚拟的分割了这个世界,而西方近代却用0、1(阴阳)在计算机里虚拟合成了这个世界;还有数学里的那些很奇怪而有趣的问题,比如杨辉三角, Kaprekar 常数,“421陷阱”等,不知道是不是与它们最终都能转化为0、1(阴阳)有关。好了,言归正传

阿里巴巴笔试题选解

心已入冬 提交于 2020-02-23 22:34:17
阿里巴巴笔试题选解 -- 9月22日,阿里巴巴北邮站 小题:(部分题目) 1 、有三个结点的,可以构成多少个种叉树? 2 、一副牌 52 张 ( 去掉大小王 ) ,从中抽取两张牌,一红一黑的概率是多少? 编程题: 3 、 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。情特别注意优化时间复杂度的常数。 4 、 已知三个升序整数数组a[l], b[m]和c[n]。请在三个数组中各找一个元素,是的组成的三元组距离最小。三元组的距离定义是:假设a[i]、b[j]和c[k]是一个三元组,那么距离为: Distance = max(|a[ I ] – b[ j ]|, |a[ I ] – c[ k ]|, |b[ j ] – c[ k ]|) 请设计一个求最小三元组距离的最优算法,并分析时间复杂度。 5 、 在黑板上写下50个数字:1至50.在接下来的49轮操作中,每次做如下动作:选取两个黑板上的数字a和b,擦去,在黑板上写|b - a|。请问最后一次动作之后剩下数字可能是什么?为什么? 题解: (题解非官方,仅供参考,有错误的地方望指正!谢谢) 1 、有三个结点的,可以构成多少个种树形结构? 解:应该是5种; 2、一副牌 52 张 ( 去掉大小王 ) ,从中抽取两张牌,一红一黑的概率是多少? 考察概率论知识 解法一:

小白刷怪篇1

妖精的绣舞 提交于 2020-02-23 19:33:16
前段时间,小白经过日夜兼程,有了那么一丢丢基础,那么咋们现在拿起武器来进行刷怪吧! 一、小怪篇 1.矩阵不仅是表示多维数组,而且是表示图的重要工具,这样的说法正确吗? 这样的说话正确;图的表示方法有两种,分别是邻接矩阵和邻接表; 2.优化的起泡排序的排序趟数与参加排序的序列原始状态有关() 肯定的,优化过的气泡排序与序列有关,最初的与序列无关 3.对待排序的元素序列进行划分,将其分为左、右两个子序列,再对两个子序列施加同样的排序操作,直到子序列为空或只剩一个元素为止。这样的排序方法是 __ 快速排序 __ 。 快排思想:第一次排序,根据选取的枢纽元将序列分为两部分,枢纽元左边的A部分都比枢纽元小,枢纽元右边的B部分都比枢纽元大再分别对AB两部分进行枢纽元选取和划分 快速排序的思想就是分治法。 4.内部排序方法的稳定性是指该排序算法不允许有相同的关键字记录。 错误 排序方法的稳定性是指在排序过程中是否改变相同元素的相对位置,若不变则稳定,否则不稳定。 举个例子: 稳定:如果 a 原本在 b 前面,而 a = b ,排序之后 a 仍然在 b 的前面; 不稳定:如果 a 原本在 b 的前面,而 a = b ,排序之后 a 可能会出现在 b 的后面; 5.若串S=′software′,其子串的数目是() 37 刚开始,我填的是9 字串(包含空串): n(n+1)/2 + 1 非空子串:n

栈与队列

旧巷老猫 提交于 2020-02-21 19:37:30
目录 1 栈的定义 2 栈的顺序存储结构及实现 2.1 栈的顺序存储结构 2.2 栈的顺序存储结构--进栈出栈操作 3 两栈共享空间 4 栈的链式存储结构及实现 4.1 栈的链式存储结构--进栈操作 4.2 栈的链式存储结构--出栈操作 5 栈的应用--四则运算表达式求值 5.1 后缀表达式计算结果 5.2 中缀表达式转后缀表达式 6 队列的定义 7 循环队列 7.1 队列顺序存储 7.2 循环队列定义 8 队列的链式存储结构及实现 8.1 队列的链式存储结构--入队操作 8.2 队列的链式存储结构--出队操作 1 栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈,栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。 栈是一个线性表,栈元素具有线性关系,即前驱后继关系,栈的表尾是指栈顶,而不是栈底。栈底是固定的,最先进栈的只能在栈底,栈的插入操作,叫作进栈,栈的删除操作,叫作出栈。 2 栈的顺序存储结构及实现 2.1 栈的顺序存储结构 栈的顺序存储其实也是线性表存储的简化,称为顺序栈;线性表是用数组来实现的,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底。 定义一个top变量指示栈顶元素在数组中的位置,若存储栈的长度为StackSize