
算法
什么啊什么Q
keep slow
展开
-
KMP算法
KMP 算法(Knuth-Morris-Pratt 算法)是一个著名的字符串匹配算法,效率很高,但是确实有点复杂。很多读者抱怨 KMP 算法无法理解,这很正常,想到大学教材上关于 KMP 算法的讲解,也不知道有多少未来的 Knuth、Morris、Pratt 被提前劝退了。有一些优秀的同学通过手推 KMP 算法的过程来辅助理解该算法,这是一种办法,不过本文要从逻辑层面帮助读者理解算法的原理。十行代码之间,KMP 灰飞烟灭。先在开头约定,本文用 pat 表示模式串,长度为 M,txt 表示文本串...转载 2020-09-01 17:03:28 · 193 阅读 · 0 评论 -
如何理解Kosaraju算法?
首先, 你得熟悉有向图(digraph)的深度优先搜索(DFS), 前序(preorder), 后序(postorder), 逆后序(reverse postorder), 有向图的逆(transpose graph); 如果把一个强连通分量中的所有点浓缩(contract)成一个点, 那么原图G就变成了一个有向无环图(DAG); 易证, 一个DAG至少有一个源(source)和一个汇(sink);(源,只有指出,汇,只有指进) 如果我们从sink分量中的任一节点开始DFS, 那么我们就不能到达其他任转载 2020-08-25 19:04:42 · 210 阅读 · 0 评论 -
如何理解最短路径中的“松弛”操作
这是图算法的第五篇文章:图解:最短路径之如何理解“松弛”or“放松”?最短路径问题的目的是找到从一个顶点到达另一个顶点的成本最小的路径。最短路径算法被广泛地应用于解决各种复杂的问题,比如在地图中寻找两个地点之间的最短路径,如何在网络连接中为路由器寻找最短的传输路径等等。为了实现最短路径算法,人们发明了一系列的算法,比如:Dijkstra算法与Bellman-Ford算法。但是这些算法都基于一个被称为放松的基本操作relaxtion,有些人称为松弛,我就直接简单翻译为放松了,别管怎么叫,理解就行在转载 2020-08-21 11:39:28 · 11449 阅读 · 14 评论 -
归并排序算法
归并排序:归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序的核心思想是将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。如图,从下到上,每一步都需要将两个已经有序的子数组合并成一个大的有序数组,如下是实现合并的具体代码,请读者细细体会p转载 2020-06-12 23:46:17 · 215 阅读 · 0 评论 -
中缀表达式转化成前缀和后缀表达式-二叉树
思路:第一步:中序表达式--->二叉树第二步:对二叉树进行前序遍历,得到前缀表达式,对二叉树进行后序遍历,得到后缀表达式。第一步:中序表达式转为二叉树在上篇文章栈结构与四则运算中提到了通过算术表达式构造二叉树,比如9+(3-1)*3+10/2是一个标准的算术表达式,也叫中缀表达式。在通过中缀表达式构造二叉树的过程中,计算数要作为叶子节点,运算符作为中间节点,考虑算术优先级。因为正常单从一个中缀表达式是无法获得唯一的一个二叉树结构的。总结来说,中缀表达式构造二叉树有以下几个步骤...转载 2020-06-05 12:19:01 · 4145 阅读 · 1 评论 -
中缀表达式转前缀和后缀表达式-栈结构
前缀、中缀、后缀表达式前缀表达式:/+A*BCD。 中缀表达式:A+B*C/D。 后缀表达式:ABC*+D/。中缀表达式转换后缀表达式思路 操作数顺序不变,将运算符进行排序将栈初始化为空栈; 从左到右扫描表达式的每一个字符,执行下面操作: 2.1 遇到操作数:直接输出(添加到后缀表达式中) 2.2 栈为空时,遇到运算符,直接入栈 2.3 遇到左括号:将其入栈 2.4 遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,...翻译 2020-06-05 11:57:41 · 739 阅读 · 1 评论 -
中缀表达式转前缀和后缀表达式-笔算
中缀表达式:a+b*c-(d+e)第一步:按照运算符的优先级对所有的运算单位加括号式子变成拉:((a+(b*c))-(d+e))第二步:转换前缀与后缀表达式前缀:把运算符号移动到对应的括号前面则变成拉:-( +(a *(bc)) +(de))把括号去掉:-+a*bc+de 前缀式子出现后缀:把运算符号移动到对应的括号后面则变成拉:((a(bc)* )- (de)+ )-把括号去掉:abc*+de+- 后缀式子出现发现没有,前缀式,后缀式是不需要..转载 2020-06-05 10:42:56 · 305 阅读 · 0 评论 -
均值递推和方差递推公式
在一般的数学统计过程中,为了求得方差,需要预先知道所有的数据项,然后通过求均值,再通过遍历所有数据项计算平方和的方式求得方差。但是在大数据、流式处理的场景,是无法预先知道所有数据项的,经常需要在任意时候动态的知道当前所有存量数据的方差,此时如果使用遍历的方式,将耗费大量的计算量,同时,缓存所有的数据也占用大量存储空间。所以需要通过递推的方式,通过之前状态的均值、方差、计数、以及当前数据项来计算出当前状态的方差。方差递推公式的计算过程如下:整个推导过程是用word结合MathType写的,复制到ma转载 2020-05-15 00:21:37 · 3578 阅读 · 0 评论 -
数学归纳法求证欧几里得算法
使用数学归纳法证明欧几里得算法能够计算任意一对非负整数p和q的最大公约数。基础步骤:求证gcd(p,q)=gcd(q,r)证:令p=a*q+r,其中p、a、q、r均为非负整数。设整数d|p、d|q,则d|(p-a*q),得p与q的公约数和q与r的公约数相同。设整数d|q、d|r,则d|(a*q+r),得q与r的公约数和p与r的公约数相同。基于上述两点得gcd(p,q)=gcd(q,r)。...转载 2020-03-13 16:05:19 · 990 阅读 · 1 评论 -
运算符的优先级
优先级 运算符 结合性 1 ()、[]、{} 从左向右 2 !、+、-、~、++、-- 从右向左 3 *、/、% 从左向右 4 +、- 从左向右 5 «、»、>>> 从左向右 6 <、<=、>、>=、instanceof 从左向右 7 ==...转载 2020-03-06 17:56:13 · 314 阅读 · 0 评论 -
牛顿迭代算法 sqrt函数
因为吹水的能力不佳,所以要先打个草稿,今天的吹水过程大概是:1、牛顿迭代法的演绎过程2、牛顿迭代法求n次方根3、牛顿迭代法求n次方根改进版4、牛逼哄哄的invsqrt求平方根倒数1、牛顿迭代法的演绎过程乍一听,好像很高大上,其实理解上没什么难度。牛顿迭代法就是在不断迭代的过程中逼近曲线的根,可以看做,它就是用来求曲线的根的。所以它是怎么个迭代的过程,先上个动图:牛顿迭代...转载 2020-02-26 18:03:33 · 993 阅读 · 0 评论 -
佛洛依德算法原理讲解
暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。 上图中有4个城市8条公路,公路上的数字表示这条公路的长短。请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题这也被称为“多源最短路径”问题。 ...转载 2020-02-24 13:13:40 · 761 阅读 · 2 评论 -
判断素数只需到平方根就可以?
对于大于1的正整数,只能被1和他本身整除的数,即是素数。1、java代码演示 private static boolean isPrime(int number) { if(number < 2) return false; for(int i = 2; i * i < number ; i++){ if(number ...原创 2019-08-07 10:34:10 · 2429 阅读 · 0 评论 -
java 牛顿迭代法求平方根
牛顿迭代法的大题意思就是通过不停的迭代来逐渐的使方程收敛。因为切线是一条直线,也就是线性的,所以我们可以说,A点的切线是f(x)的线性逼近。离A点距离越近,这种逼近的效果也就越好,也就是说,切线与曲线之间的误差越小。所以我们可以说在A点附近,切线约等于f(x);例如我们求m的平方根其实就是相当于求f(x) = x^2 - m方程与x轴交点也就是求想x^2 - m = 0 的根。Xn...转载 2019-08-08 18:38:07 · 1054 阅读 · 0 评论 -
算法学习之路
我的算法学习之路关于严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的。原文链接:http://zh.lucida.me/blog/on-learning-algorithms/原文作者:Lucida这篇文章讲了什么?我这些年学习数据结构...转载 2019-07-08 10:48:02 · 300 阅读 · 0 评论 -
二叉树,B-Tree,B+Tree,B*Tree介绍
这是一片很棒的针对b-tree,b+tree,b*tree的介绍文档:1、平衡二叉树(1)由来:平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构;(2)特点:平衡二叉树是采用二分法思维把数据按规则组装成一个树形结构的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度;平衡二叉树的数据结构组装过程有以下规则:非叶子节点只能允许最多两个子节点...转载 2019-04-28 15:10:05 · 255 阅读 · 0 评论 -
算法复杂度
【对于一个给定的算法,通常要评估其正确性和运行效率的高低。算法的正确性评估不在本文范围之内,本文主要讨论从算法的时间复杂度特性去评估算法的优劣。】程序是用来解决问题的,是由多个步骤或过程组成的,这些步骤和过程就是解决问题的算法。解决一个问题有多种方法,也就有多种算法。每一种算法都可以达到解决问题的目的,但花费的成本和时间不尽相同,从节约成本和时间的角度考虑,需要找出最优算法。那么,如何衡量一个...转载 2019-04-28 14:30:48 · 227 阅读 · 0 评论