
算法
CryptWinter
Talk is cheap,show me the code.
展开
-
【数据结构与算法】【算法思想】 A *搜索算法
算法解析这是一个非常典型的搜索问题。人物的起点就是他当下所在的位置,终点就是鼠标点击的位置。我们需要在地图中,找一条从起点到终点的路径。这条路径要绕过地图中所有障碍物,并且看起来要是一种非常聪明的走法。所谓“聪明”,笼统地解释就是,走的路不能太绕。理论上讲,最短路径显然是最聪明的走法,是这个问题的最优解。实际上,像出行路线规划、游戏寻路,这些真实软件开发中的问题,一般情况下都不需要非得求最优解(也就是最短路径)。在权衡路线规划质量和执行效率的情况下,我们只需要寻求一个次优解就足够了。如何快原创 2020-09-23 17:14:29 · 658 阅读 · 0 评论 -
【数据结构与算法】【算法思想】Dijkstra算法
图的两种搜索算法,深度优先搜素和广度优先搜索。这两种算法主要是针对无权图的搜索算法。针对有权图,也就是图中的每条边都有一个权重,该如何计算两点之间的最短路径?最短路径算法(Shortest Path Algorithm)。一:算法解析最优问题包含三个:最短路线,最少用时,最少红绿灯。1,解诀软件开发中的实际问题,最重要的一点就是建模,也就是将复杂的场景抽象成具体的数据结构。2,图的表达能力强,可以将求解的最短路径问题转化为:在一个有向有权图中,求两个顶点间的最短路径。3,要解决这个问题,有个非常经原创 2020-09-23 17:06:14 · 734 阅读 · 0 评论 -
【数据结构与算法】【算法思想】【算法应用】【排序查找搜索】并行
算法的目的就是为了提高代码执行的效率。当算法无法再继续优化的情况下,需要借助并行计算的处理思想对算法进行改造。并行排序假设要给大小为 8GB 的数据进行排序,最常用的是三种排序算法,归并排序、快速排序、堆排序,时间复杂度为 O(nlogn) 。从理论上讲,已经很难再从算法层面优化了。而利用并行的处理思想可以将执行效率提高很多倍。第一种是对归并排序并行化处理将这8GB 的数据划分成 16 个小的数据集合,每个集合包含 500MB 的数据。用 16 个线程,并行地对这 16 个 500MB 的数据集原创 2020-09-23 16:47:40 · 201 阅读 · 0 评论 -
【数据结构与算法】【算法思想】【算法总结】索引结构
“基础不是100分考60分,而是建摩天大楼的地基。”为什么需要索引?(1)在实际的软件开发工作的本质都可以抽象为“对数据的存储和计算”。对应到数据结构和算法中,那“存储”需要的就是数据结构,“计算”需要的就是算法。(2)对于存储的需求,功能上无外乎增删改查。当存储的数据很多,性能就会成为这些系统要关注的重点,特别是在存储相关的基础系统、中间件中。(3)“如何节省存储空间、如何提高数据增删改查的执行效率”,解决这样的问题离不开索引索引的需求定义对于系统设计需求,一般可以从功能性需求和非功能性需.原创 2020-09-23 16:38:31 · 164 阅读 · 0 评论 -
【数据结构与算法】【算法思想】【MySQL数据库索引】B+树
B+树特点考虑因素支持按照区间来查找数据磁盘 IO 操作N叉树树的高度就等于每次查询数据时磁盘 IO 操作的次数在选择 m 大小的时候,要尽量让每个节点的大小等于一个页的大小。读取一个节点,只需要一次磁盘 IO 操作。(分裂成两个节点)问题跳表和B+树在实现难度和性能上有什么区别,在数据量很大的情况下,表现性能如何,为什么redis选跳表?b+树主要是用在外部存储上,为了减少磁盘IO次数。跳表比较适合内存存储。实际上,两者本质的设计思想是雷同的,性能差距还是要具体看应用场景,无法从原创 2020-09-19 21:49:54 · 1714 阅读 · 0 评论 -
【数据结构与算法】【算法思想】【推荐系统】向量空间
背景知识欧几里得的距离公式推荐系统方法应用如何实现一个简单的音乐推荐系统?1. 基于相似用户做推荐找到跟你口味偏好相似的用户,把他们爱听的歌曲推荐给你;2. 基于相似歌曲做推荐找出跟你喜爱的歌曲特征相似的歌曲,把这些歌曲推荐给你。笔记整理来源: 王争 数据结构与算法之美...原创 2020-09-19 20:23:20 · 199 阅读 · 0 评论 -
【数据结构与算法】【算法思想】位图
位图BitMap算法public class BitMap { // Java中char类型占16bit,也即是2个字节 private char[] bytes; private int nbits; //nbits 总容量 public BitMap(int nbits) { this.nbits = nbits; this.bytes = new char[nbits/16+1]; } //长度16 k/16 定位某一段 k%16定位段中某一位 pub原创 2020-09-19 19:13:39 · 227 阅读 · 0 评论 -
【数据结构与算法】【算法思想】动态规划
贪心算法回溯算法分治算法动态规划贪心:一条路走到黑,就一次机会,只能哪边看着顺眼走哪边回溯:一条路走到黑,无数次重来的机会,还怕我走不出来 (Snapshot View)动态规划:拥有上帝视角,手握无数平行宇宙的历史存档, 同时发展出无数个未来 (Versioned Archive View)初识动态规划、动态规划理论、动态规划实战初识动态规划动态规划比较适合用来求解最优问题,比如求最大值,最小值等。可以非常显著地降低时间复杂度,提高的执行效率。0-1背包问题使用回溯算法:使用回溯法原创 2020-08-28 20:30:16 · 282 阅读 · 0 评论 -
【数据结构与算法】【算法思想】回溯算法
贪心算法回溯算法分治算法动态规划回溯算法思想应用广泛,除了用来指导深度优先搜索这种经典算法设计之外,还可以用在如正则表达式匹配,编译原理中的语法分析等。除此之外,很多经典的数学问题都可以用回溯算法解决,比如数独,八皇后,0-1背包,图的着色,旅行商问题,全排列等等。一:如何理解“回溯算法”回溯的处理思想,有些类似枚举搜索。枚举所有的解,找到满足期望的解。为了有规律的枚举所有可能的解,避免遗漏和重复,所以把问题求解的过程分为多个阶段。每个阶段都有多个选择,先随意选择一个,当发现走不通时,就退回到原创 2020-08-28 11:13:34 · 210 阅读 · 0 评论 -
【数据结构与算法】【算法思想】【联系与区别】回溯 贪心 动态规划 分治
4种算法思想比较与联系如果将贪心,分治,回溯和动态规划四种算法思想分类,那贪心,回溯,动态规划可归为一类,而分治单独可以作为一类,因为它跟其他是三个都不大一样。因为前三个算法解决问题的模型,都可以抽象成多阶段决策最优解模型,而分治算法解决问题尽管大部分也还是最优解问题,但大部分都不能抽象成多阶段决策模型。回溯算法,是个万金油。基本上能用动态规划,贪心解决的问题,都可以用回溯算法解决。回溯算法相当于穷举搜索。穷举所有的情况,然后对比得到最优解。不过,回溯算法的时间复杂度非常高,是指数级别的,只能用来解决原创 2020-08-27 22:06:46 · 462 阅读 · 0 评论 -
【数据结构与算法】【算法思想】分治算法
贪心算法回溯算法分治算法动态规划MapReduce本质就是分治算法,是Google大数据处理的三驾马车之一,另外两个是GFS和Bigtable。它在倒排索引,PageRank计算,网页分析等搜索引擎相关的技术中都有大量的应用。MapReduce 框架只是一个任务调度器,底层依赖 GFS 来存储数据,依赖 Borg 管理机器。它从 GFS 中拿数据,交给 Borg 中的机器执行,并且时刻监控机器执行的进度,一旦出现机器宕机、进度卡壳等,就重新从 Borg 中调度一台机器执行。一:如何理解分治算法原创 2020-08-26 16:44:26 · 675 阅读 · 0 评论 -
【数据结构与算法】字符串匹配 AC自动机
单模式串匹配BF 算法和 RK 算法BM 算法和 KMP 算法多模式串匹配算法Trie 树和 AC 自动机AC 自动机AC 自动机实际上就是在 Trie 树之上,加了类似 KMP 的 next 数组,只不过此处的 next 数组是构建在树上罢了。AC 自动机的构建将多个模式串构建成 Trie 树;-在 Trie 树上构建失败指针(相当于 KMP 中的失效函数 next 数组)。public void buildFailurePointer() { Queue<AcN.原创 2020-08-25 16:48:41 · 215 阅读 · 0 评论 -
【数据结构与算法】【应用】字符串匹配
单模式串匹配BF 算法和 RK 算法BM 算法和 KMP 算法多模式串匹配算法Trie 树和 AC 自动机一、单模式串匹配:BF: 简单场景,主串和模式串都不太长, O(m*n)KP:字符集范围不要太大且模式串不要太长, 否则hash值可能冲突,O(n)naive-BM:模式串最好不要太长(因为预处理较重),比如IDE编辑器里的查找场景,命令grep; 预处理O(m*m), 匹配O(n), 实现较复杂,需要较多额外空间.KMP:适合所有场景,整体实现起来也比BM简单,O(n+m),仅.原创 2020-08-25 16:28:22 · 234 阅读 · 0 评论 -
【数据结构与算法】字符串匹配 KMP 算法
单模式串匹配BF 算法和 RK 算法BM 算法和 KMP 算法多模式串匹配算法Trie 树和 AC 自动机KMP 算法KMP 算法是根据三位作者(D.E.Knuth,J.H.Morris 和 V.R.Pratt)的名字来命名的,算法的全称是 Knuth Morris Pratt 算法,简称为 KMP 算法。思想1,KMP算法的核心思想,与BM算法非常相近。假设主册是a,模式串是b。再模式串与主串匹配的过程中,当遇到不可匹配的字符的时候,找到一些规律,将模式串往后多滑动几位,跳过肯定不会匹.原创 2020-08-25 15:51:56 · 495 阅读 · 0 评论 -
【数据结构与算法】字符串匹配 BM算法
单模式串匹配BF 算法和 RK 算法BM 算法和 KMP 算法多模式串匹配算法Trie 树和 AC 自动机BM算法BM算法的核心思想是通过将模式串沿着主串大踏步的向后滑动,从而大大减少比较次数,降低时间复杂度。而算法的关键在于如何兼顾步子迈得足够大与无遗漏,同时要尽量提高执行效率。这就需要模式串在向后滑动时,遵守坏字符规则与好后缀规则,同时采用一些技巧。坏字符规则从后往前逐位比较模式串与主串的字符,当找到不匹配的坏字符时,记录模式串的下标值si,并找到坏字符在模式串中,位于下标si前的最.原创 2020-08-25 14:16:33 · 267 阅读 · 0 评论 -
【数据结构与算法】字符串匹配 BF算法 RK算法
单模式串匹配BF 算法和 RK 算法BM 算法和 KMP 算法多模式串匹配算法Trie 树和 AC 自动机一、BF 算法1,BF算法是Brute Force的缩写,中文译作暴力匹配算法,也叫朴素匹配算法。2,两个概念:主串和模式串如在字符串A中查找字符串B,则字符串A就是主串,字符串B就是模式串将主串长度记为n,模式串的长度记作m。因为是在主串中查找模式串,所以n>m3,BF算法的思想可概括为:我们在主串中,检查起始位置分别是0,1,2……n-m且长度为m的n-m+1个子串,看.原创 2020-08-24 20:05:34 · 291 阅读 · 0 评论 -
【数据结构与算法】广度优先遍历(BFS) 深度优先遍历(DFS)
一、 搜索算法深度优先搜索和广度优先搜索是最暴力的图的搜索算法。算法的目标是,给定一张图,一对初始和终止节点,找到两节点之间的节点路径。广度优先搜索是一层一层搜索,深度优先搜索是搜到底,不能走了在回溯。无向图public class Graph { // 无向图 private int v; // 顶点的个数 private LinkedList<Integer> adj[]; // 邻接表 public Graph(int v) { this.v = v;原创 2020-08-24 17:42:39 · 1091 阅读 · 0 评论 -
[Leetcode][第459题][JAVA][重复的字符串][子串][匹配]
【问题描述】[中等]【解答思路】1. 枚举找出能整除的子串长度,再用substring遍历匹配即可时间复杂度:O(N^2) 空间复杂度:O(1)class Solution { public boolean repeatedSubstringPattern(String s) { int len = s.length(); for(int i = 1 ;i<=len/2;i++){ String sub =原创 2020-08-24 10:49:31 · 236 阅读 · 0 评论 -
【数据结构与算法】图
一:如何理解“图”1,图和树一样都是非线性表数据结构,和树不同的是图是一种更加复杂的非线性表结构2,树中的元素称之为节点,图中的元素则称之为顶点。3,顶点可以与任意其他顶点建立关联,这种建立的关系叫做边,与顶点相连接的条数叫做顶点的度。4,图可以分为有向图和无向图两种,有向图的边有方向。5,在有向图中,度可以分为入度和出度(Out-degree)6,带权图:在带权图中,每条边都有一个权重二:邻接矩阵存储方法1,图最直观的一种存储方法是:邻接矩阵(Adjacency Matrix),邻接矩阵原创 2020-08-23 16:18:46 · 240 阅读 · 0 评论 -
【数据结构与算法】堆
一:如何理解“堆”1,堆是一个完全二叉树;完全二叉树要求除了最后一层,其他层的节点都是满的,最后一层的节点都靠左排列。2,堆中每个节点都必须大于等于(或小于等于)其子树中每个节点的值。堆中每个节点的值都大于等于(或者小于等于)其左右子节点的值。3,对于每个节点的值都大于等于子树中每个节点值的堆,叫作“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,叫“小顶堆”。二:如何实现“堆”要实现一个堆,要先知道堆都支持哪些操作,已及如何存储一个堆。1,如何存储一个堆:完全二叉树比较适合用数原创 2020-08-23 16:05:31 · 627 阅读 · 0 评论 -
【数据结构与算法】递归树
1.树、二叉树2.二叉查找树3.平衡二叉树、红黑树4.递归树一、什么是递归树如果我们把这个一层一层的分解过程画成图,它其实就是一棵树。我们给这棵树起一个名字,叫作递归树。时间复杂度分析的递归树法分析每一步核心操作的时间复杂度分析树高:最大树高和最小树高计算每层复杂度,全加起来(放缩法调整)二、实战实战1:快速排序快速排序在最好情况下,每次分区都能一分为二,这个时候用递推公式 T(n)=2T(2n)+n,很容易就能推导出时间复杂度是 O(nlogn)。分割算法是O(n)2原创 2020-08-21 17:29:35 · 9288 阅读 · 0 评论 -
【数据结构与算法】平衡二叉树、红黑树
1.树、二叉树2.二叉查找树3.平衡二叉树、红黑树4.递归树一,什么是“平衡二叉查找树”1,定义:二叉树中任意一个节点的左右子树的高度相差不能大于1。所以:完全二叉树,满二叉树都是平衡二叉树,非完全二叉树也有可能是平衡二叉树。2,平衡二叉查找树不仅满足上面平衡二叉树的定义,还满足二叉查找树的特点。3,发明平衡二叉查找树这类数据结构的初衷是解决普通二叉查找树在频繁的插入,删除等动态更新的情况下,出现时间复杂度退化的问题。所以,平衡二叉查找树中“平衡”的意思,其实就是让整棵树左右看起来比较“对原创 2020-08-21 16:18:59 · 310 阅读 · 0 评论 -
【数据结构与算法】哈希算法
一、什么是哈希算法?1.定义将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。2.如何设计一个优秀的哈希算法?①单向哈希:从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。②篡改无效:对输入敏感,哪怕原始数据只修改一个Bit,最后得到的哈希值也大不相同。③散列冲突:散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小。④执行效率:哈希算法的执行效率要尽量高效,针对较长的文本,也能快速计原创 2020-08-19 15:40:23 · 481 阅读 · 0 评论 -
【数据结构与算法】散列表
一、散列表的由来?1.散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。2.需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散列值。3.将数据存储在散列值对应的数组下标位置。二、如何设计散列函数?总结3点设计散列函数的基本要求1.散列函数计算得到的散列值是一个非负整数。2.若key1=key2,则hash(key1)=hash(key2)3.若key≠key2,则hash(key1)≠has原创 2020-08-18 21:33:38 · 1170 阅读 · 0 评论 -
【数据结构与算法】跳表
一、什么是跳表?为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。如下图所示,其中down表示down指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这种为链表建立多级索引的数据结构就称为跳表。二、跳表的时间复杂度?1.计算跳表的高度如果链表有n个节点,每2个节点抽取抽出一个节点作为上一级索引的节点,那第1级索引的节点个数大约是n/2,第2级索引的节点个数大约是n/4,依次类推,第k级索引的节点个数就原创 2020-08-18 17:14:22 · 2657 阅读 · 0 评论 -
【数据结构与算法】二分查找
一、什么是二分查找?二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0。二、时间复杂度分析?1.时间复杂度假设数据大小是n,每次查找后数据都会缩小为原来的一半,最坏的情况下,直到查找区间被缩小为空,才停止。所以,每次查找的数据大小是:n,n/2,n/4,…,n/(2k),…,这是一个等比数列。当n/(2k)=1时,k的值就是总共缩小的次数,也是查找的总次数。而每次缩小操作只涉及两个数据的大小比较,所以,经过k次区间原创 2020-08-18 00:08:32 · 627 阅读 · 0 评论 -
【数据结构与算法】排序优化
冒泡、插入、选择 O(n^2) 基于比较快排、归并 O(nlogn) 基于比较计数、基数、桶 O(n) 不基于比较总结:如何实现一个通用的高性能的排序函数?一、如何选择合适的排序算法?1.排序算法一览表时间复杂度是稳定排序?是原地排序?冒泡排序 O(n^2)是是插入排序 O(n^2)是是选择排序 O(n^2)否是快速排序 O(nlogn)否是归并排序 O(nlogn)是否桶排序 O(n)是否计数排序 O(n+k原创 2020-08-17 14:26:05 · 187 阅读 · 0 评论 -
【数据结构与算法】计数、基数、桶 O(n) 不基于比较
冒泡、插入、选择 O(n^2) 基于比较快排、归并 O(nlogn) 基于比较计数、基数、桶 O(n) 不基于比较桶排序–>分区间桶+快速排序(归并排序(稳定性))–>取出结果计数排序(特殊的桶排序)–>分单个桶+计数–>先统计计数,再取出来,实现排序基数排序–>在每个位上桶排序–>一、线性排序算法介绍1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法的时间复杂度为O(n)。3.此3种排序算法都不涉及元素之间的比较操作,是非基于比较的排序原创 2020-08-17 14:03:14 · 144 阅读 · 0 评论 -
【数据结构与算法】排序 冒泡、插入、选择 O(n^2)
冒泡、插入、选择 O(n2) 基于比较快排、归并 O(nlogn) 基于比较计数、基数、桶 O(n) 不基于比较一、如何分析一个排序算法?学习排序算法的思路?明确原理、掌握实现以及分析性能。如何分析排序算法性能?从执行效率、内存消耗以及稳定性3个方面分析排序算法的性能。执行效率:从以下3个方面来衡量1)最好情况、最坏情况、平均情况时间复杂度2)时间复杂度的系数、常数、低阶:排序的数据量比较小时考虑3)比较次数和交换(或移动)次数内存消耗:通过空间复杂度来衡量。针对排序算法的空间复杂度,原创 2020-08-05 18:24:23 · 239 阅读 · 0 评论 -
【数据结构与算法】递归
一、什么是递归?1.递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。2.方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。二、为什么使用递归?递归的优缺点?1.优点:代码的表达力很强,写起来简洁。2.缺点:空间复杂度高、有堆栈溢出风险、存在重复计算、过多的函数调用会耗时较多等问题。三、什么样的问题可以用递归解决呢?一个问题只要同时满足以下3个条件,就可以用递归来解决:1.问题的解可以分解为几个子问题的解。何为子原创 2020-08-05 16:12:04 · 145 阅读 · 0 评论 -
[Leetcode][第337题][JAVA][打家劫舍3][递归][动态规划]
【问题描述】[中等]【解答思路】1. 动态规划第 1 步:状态定义dp[node][j] :这里 node 表示一个结点,以 node 为根结点的树,并且规定了 node 是否偷取能够获得的最大价值。j = 0 表示 node 结点不偷取;j = 1 表示 node 结点偷取。第 2 步: 推导状态转移方程根据当前结点偷或者不偷,就决定了需要从哪些子结点里的对应的状态转移过来。如果当前结点不偷,左右子结点偷或者不偷都行,选最大者;如果当前结点偷,左右子结点均不能偷。(状态转移方程的表转载 2020-08-05 15:48:32 · 275 阅读 · 0 评论 -
【数据结构与算法】栈与队列
栈一、什么是栈?1.后进者先出,先进者后出,这就是典型的“栈”结构。2.从栈的操作特性来看,是一种“操作受限”的线性表,只允许在端插入和删除数据。二、为什么需要栈?1.栈是一种操作受限的数据结构,其操作特性用数组和链表均可实现。2.但,任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险。3.所以,当某个数据集合只涉及在某端插入和删除数据,且满足后进者先出,先进者后出的操作特性时,我们应该首选栈这种数据结构。三、如何实现栈?原创 2020-08-05 01:02:24 · 400 阅读 · 0 评论 -
【数据结构与算法】数组与链表
数组的定义和特性数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。线性表(Linear List):数组、链表、队列、栈 非线性表:树 图连续的内存空间和相同类型的数据性能 低效“插入”和“删除”警惕 数组越界数组和链表的区别“链表适合插入、删除,时间复杂度 O(1);数组适合查找,数组支持随机访问,根据下标随机访问的时间复杂度为 O(1)”。(数组是适合查找操作,但是查找的时间复杂度并不为 O(1)。即便是排好序的数组,你原创 2020-08-03 14:10:14 · 553 阅读 · 0 评论 -
【数据结构与算法】复杂度分析
一、什么是复杂度分析?1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。4.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。二、为什么要进行复杂度分析?1.和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高、易操作、指导性强的特点。2.掌握复杂度分析,将能编写出性能更优的代码,有利于降低系统开发和维护成本。三、如原创 2020-08-02 00:10:11 · 360 阅读 · 0 评论 -
【知识导图】数据结构与算法
[基础知识点]10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法[学习技巧]学习它的“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景1. 边学边练,适度刷题可以“适度”刷题,但一定不要浪费太多时间在刷题上。我们学习的目的还是掌握,然后应用。2. 多问、多思考、多互动学习最好的方法是,找到几个人一起学习,一块儿讨论切磋,有问题及时寻求答疑。3原创 2020-07-31 19:58:49 · 258 阅读 · 0 评论 -
[算法][算法复杂度]常用算法复杂度速查表
复杂度通常会使用大 -O记号来表示,比如快速排序的平均时间复杂度是 O(nlog(n))。虽然我们应该做「理解派」,但是即使每个算法/数据结构都理解了,不时仍有可能忘记具体某个算法/数据结构的复杂度(特别是在最好、最坏和平均情形下的复杂度)。原文链接:https://mp.weixin.qq.com/s/U6D1PNjuBAcRd5UZRr0F3w模型链接:http://bigocheatsheet.com/...转载 2020-07-25 12:19:27 · 259 阅读 · 0 评论 -
[JAVA][算法] [字符串匹配]KMP
我们为什么需要KMP?在字符串匹配问题中,我们需要找到匹配串pattern在原串text中的位置,一种显而易见的思路就是暴力匹配,如图所示,我们把pattern放置到text中的每个位置进行比较即可。但是大家可以发现,这种方式的时间复杂度太高了,达到了O(pattern.length * text.length),我们是否可以进一步进行优化呢?在第一次匹配时,abaa和abab的最后一个字符不匹配,前面aba都匹配好了,移动了一位之后,发现前面又匹配不上了,这次移动相当于多此一举。换句话说,我们每次移原创 2020-07-09 21:22:35 · 191 阅读 · 0 评论