算法设计与应用
文章平均质量分 94
Small_Fish25
Stay Foolish Stay Hungry
展开
-
字符串模式匹配问题——BM算法
BM算法最近在学习数据结构与算法,在字符串模式匹配的算法学习时,总结了一下知识点方便自己回顾与理解。其他相关字符串匹配算法:RK算法KMP算法BM算法思想:有模式串中不存在的字符,那么肯定不匹配,往后多移动几位,提高效率。因此,BM算法就是借助这种规律,在模式串与主串匹配的过程中,当模式串和主串某个字符不匹配的时候,能够跳过一些肯定不会匹配的情况,将模式串往后多滑动几位。BM算法定义了两个规则,好后缀规则和坏字符规则,同时其匹配的顺序是按照模式串下标从大到小的顺序,即从后往前利用好后缀和坏原创 2021-03-28 20:56:52 · 843 阅读 · 0 评论 -
字符串模式匹配问题——KMP算法
KMP算法详解其他相关模式匹配算法:RK算法KMP算法基本原理KMP算法是目前解决字符串匹配最常用的方法,其克服了暴力算法出现不匹配时的回溯问题。我们可以类比BM算法,将不能匹配的那个字符仍然叫作坏字符,把已经匹配的那段字符串叫作好前缀。当我们遇到坏字符时,就开始滑动模式串,将好前缀的后缀子串和模式串的前缀子串比较是否相同,寻找最长的相同的子串。因此KMP算法可以尽可能地让模式串移动到有效的位置。即在模式串与主串匹配的过程中,当遇到不可匹配的字符的时候,我们希望找到一些规律,可以将模式串往后多滑动原创 2021-03-28 20:48:33 · 1847 阅读 · 0 评论 -
字符串模式匹配问题——RK算法
RK算法RK 算法的全称叫 Rabin-Karp 算法,它是针对暴力求解BF方法引入了哈希算法的优化方法。在BF算法中,如果模式串长度为m,主串长度为n,对主串中n-m+1个长度为m的子串一个一个与模式串匹配,我们需要依次对比每个字符,因此时间复杂度为O(n*m)RK算法思路:通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果我们暂时不考虑哈希冲突并且某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了如果我们没有一个很好的计算哈希值的方法,那么原创 2021-03-26 15:04:51 · 494 阅读 · 0 评论 -
带你吃透分治算法(二)矩阵相乘
分治策略(二)我们在上一篇博文介绍了分治策略思想以及解决最大子数组的问题。见:带你吃透分治算法之最大子数组下面我们来介绍应用分治思想解决“矩阵相乘问题”(虽然用分治策略解决矩阵相乘问题时间复杂度不低,但是它反映的是一种思想,当我们遇到棘手问题不好解决,往往先找到能够解决的办法比找到最优办法更重要)矩阵乘法矩阵乘法我们应该都有所了解,若矩阵A和矩阵B均是nxn的方阵,则定义乘积C=A·B中的元素c(i,j)为:暴力解法:暴力解法就是按照矩阵乘积定义进行运算,得到最终的C矩阵,时间复杂度为O(n原创 2020-07-23 19:56:13 · 4688 阅读 · 0 评论 -
带你吃透分治算法 (一)最大子数组
分治算法分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。就像归并排序的排序思想一样。回忆一下归并排序的过程,我们在递归地求解一个问题时,在每层递归中应用了以下三个步骤:分解:将原问题划分为子问题,子问题的形式(性质)和原问题一样,只是规模变小了解决:当子问题的规模非常小了(如递归排序中排序元素只有一个时),则停止递归,直接进行求解。合并:将划分的两个子问题的解组合成原问题的解,不过有时我们会遇到需要求解原创 2020-07-22 21:26:53 · 1050 阅读 · 0 评论 -
算法设计与应用之二叉搜索树
今年暑假参加了某C9院校的夏令营,面试时在算法方面被问到了二叉搜索树和堆结合的问题,当时太紧张了没答出来T T,也可以说是自己太菜了吧,因此下来之后又温习了下二叉树和堆的知识。写个笔记就当记录下自己的悔恨吧T T,同时树、图和堆在各种面试场合都是重点!二叉搜索树二叉搜索树,是将二分搜索过程的动机应用于基于树的数据结构中,以更有效地支持更新操作。二叉搜索树的特点就是存储在v的左子树的元素值均小于v的值e,存储在v的右子树的元素值均大于等于v的值e,因此二叉搜索树的中序遍历便是以非降序的顺序访问这种树中的原创 2020-07-21 22:25:09 · 529 阅读 · 0 评论 -
求最大子数组及其优化——互联网公司常见面试题
最大子数组算法最大子数组算法是一个很经典的算法问题,据说是某些主流互联网公司面试常常会提问的问题。问题描述:给定一个整数数组,要求找出元素之和最大的子数组。即给你一个数组Arr[a1,a2,a3…,an],求下标j,k,使得sum = aj+a(j+1)+a(j+2)+…+ak为最大值。(最大子数组问题不仅仅是测试一个有潜力的雇员思考能力的很好的问题,而且该问题也常常应用于数字化图像处理、模式识别)注意,数组的元素可以是正数、负数、0,因此在数组的所有元素都是负数的特殊情况下,问题的解是空子数组,原创 2020-07-11 16:29:18 · 295 阅读 · 1 评论