摘要:
定义 BM 算法是由 Boyer 和 Moore 两人提出的一种高效的字符串匹配算法,被认为是一种亚线性算法(即平均的时间复杂度低于线性级别),其时间效率在一般情况下甚至比 KMP 还要快 3 ~ 5 倍。 原理 BM 算法跟其他的字符串匹配算法相比,其中一个不同之处是在比对字符的时候,扫描的顺序不 阅读全文
摘要:
定义 Dijkstra(读音:/'daɪkstrə/)算法,是用来求解一个边带权图中从某个顶点出发到达其余各个顶点的最短距离的算法。(为表达简便,下文中“起点(源点)到某个顶点的距离”简称为“某个顶点的距离”) 限制条件:各个边的权不能为负。 原理 假设s,v1,v2,...,vn(以下简称P1)为 阅读全文
摘要:
相信不少人在学数据结构的时候都被KMP算法搞的迷迷糊糊的,原理看的似懂非懂,代码写不出来,或者写出来了也不知道为什么就可以这么写。本文力求尽可能通俗详细的讲解KMP算法,让你不再受到KMP算法的困扰。 暴力匹配的痛点 所谓暴力匹配,就是从文本串的首端开始依次检查子串是否与模式串匹配,如果不匹配就将模 阅读全文
摘要:
阅读本文前,请确保您已经了解了二叉搜索树的相关内容(如定义、增删查改的方法以及效率等)。否则,建议您先学习二叉搜索树。本文假定您对二叉搜索树有了足够的了解。 效率? 众所周知,在平衡条件下,对二叉搜索树中的元素进行增删查改,时间效率为$O(log(n))$。 然而,理想很丰满,现实很骨感,实际上,二 阅读全文
摘要:
在有向图的拓扑排序——BFS这篇文章中,介绍了有向图的拓扑排序的定义以及使用广度优先搜索(BFS)对有向图进行拓扑排序的方法,这里再介绍另一种方法:深度优先搜索(DFS)。 算法 考虑下面这张图: 首先,我们需要维护一个栈,用来存放DFS到的节点。另外规定每个节点有两个状态:已访问(这里用蓝绿色表示 阅读全文
摘要:
定义 如果在一个图中,删除某个节点连同与之关联的边,会导致整个图的连通分支数增加,那么这个节点叫做 割点(Articulation Point, Cut Vertex) 如下图: 整个图的连通分支数为1,但是删除节点3后,整个图就“分裂”成了2个连通分支: 因此,节点3是整个图的割点。 方法 一个很 阅读全文
摘要:
假设你有n个任务要做,其中某些任务需要在另外一些任务之前完成,你该如何规划你的任务,使得按照你的规划依次做下去就能完成你的所有任务? 定义 拓扑排序(Topological sorting, toposort):给定一个有向无环图,将所有节点排成一个线性序列,在这个序列中只有从前面的节点指向后面的节 阅读全文
摘要:
背景 假如我们要传输一段文本,比如“hello”,怎么办?最容易想到的方法是,直接依次传输每个字符的Unicode,每个字符都用8个比特或以上来传输。这样就需要5*8=40个比特来传输。但是如果我们要传输一段很长的文本怎么办呢?产生的数据量是非常大的,为了节省成本,我们必须要把数据压缩,并且能保证对 阅读全文
摘要:
二叉树的前序、中序、后序遍历的递归版本非常好理解,在这里就不在赘述了。这里主要讲迭代版本。 事实上,计算机在进行递归调用时,会隐式的维护一个栈(叫做调用栈,Call Stack), 调用函数就把局部变量、入参、返回地址(合起来叫做栈帧,Stack Frame)一同入栈,从函数返回就出栈。 而迭代版本 阅读全文
摘要:
定义 迭代器模式(Iterator pattern):用于顺序访问集合对象里的每一个元素,不用暴露集合是怎样存储元素的。 举例 某个班级有若干个学生,现在需要统计这些学生的平均分数。假设所有学生的分数是用数组存储的: int totalScore(int *array, int n) { int s 阅读全文