algorithms
文章平均质量分 91
iteye_12150
这个作者很懒,什么都没留下…
展开
-
Stack在求算术表达式中的应用
简介 在学习stack的时候,我们知道这个数据结构在很多地方有一个很好的应用。比如编程语言中的方法调用。另外,在一些算术表达式求值的过程中,对它的应用也比较巧妙。 一个求表达式的问题 假设我们有一个算术表达式,比如((1 + (2 * 3)) / (4 + 5))。在这里,表达式是一个字符串。我们需要解析出来其中常用的运算符号比如+, -, *, /。同时,也要根据...原创 2015-01-11 16:32:37 · 119 阅读 · 0 评论 -
Diameter of a tree
简介 在之前的文章里我讨论过计算图里最短路径的几种方法,一个是Dijkstra's algorithm,一个是Bellman-Ford Algorithm。它们都是针对一个比较通用形式的图来进行计算处理的。在实际的应用中,有些比较特殊的图,在计算它们的最短路径的应用中往往还有一些更加简单的方法。 问题描述 Given a graph that is a tree (con...原创 2016-08-30 23:24:41 · 556 阅读 · 0 评论 -
Bellman-Ford Algorithm
简介 我在之前的文章里有对Dijkstra's Algorithm进行了思路的分析和讨论,但是也提到了一点,就是这个算法它有一点限制,要求图里面所有的边的权值都是非负的。因为如果有权值为负数的边,就打破了原来算法里每次取得的当前最小值是全局最优值这个假定了。那么在图里面真有权值为负数的边时,甚至在某些情况下存在有加权值为负数的环时,我们该怎么来计算单点源的最短路径呢? 这里,我们将...原创 2016-08-25 23:03:07 · 359 阅读 · 0 评论 -
Dijkstra's algorithm再理解
简介Dijkstra's algorithm是一个求图中单点到其他所有点最短距离的算法。我在之前的一篇文章里也有过一些讨论。只是那篇文章写得比较仓促,对于该算法的思想和推导理解得也并不深刻。经过一些时间的思考,这里想对该算法的思想做一个进一步的阐述,并对一些和它相关的问题进行比较讨论。 算法描述分析 对于这个算法来说,它有这么一个前提。在一个连通的图中(可以是有向图或者无向图...原创 2016-08-11 23:17:29 · 8829 阅读 · 1 评论 -
一个二叉树构建相关的问题分析
问题描述: 假设我们有一组排序的元素,希望通过他们来构建一棵平衡的二叉搜索树。那么该如何构建呢? 分析 这是一个比较有意思的问题。通过一些递归的手法可以做很好的实现。我们首先来看,如果要构建一棵平衡二叉树的话,我们理想的情况是相对于一个树的节点来说,它的两个子树的元素是一样多的。这样就从本质上保证他们可以达到平衡。 那么,如果我们现在从定义的角度更加深入一...原创 2013-03-28 09:01:37 · 160 阅读 · 0 评论 -
java集合类深入分析之TreeMap/TreeSet篇
简介 TreeMap和TreeSet算是java集合类里面比较有难度的数据结构。和普通的HashMap不一样,普通的HashMap元素存取的时间复杂度一般是O(1)的范围。而TreeMap内部对元素的操作复杂度为O(logn)。虽然在元素的存取方面TreeMap并不占优,但是它内部的元素都是排序的,当需要查找某些元素以及顺序输出元素的时候它能够带来比较理想的结果。可以说,TreeMa...原创 2013-03-27 14:49:47 · 1002 阅读 · 0 评论 -
二叉树分析之二:二叉搜索树的相关特性分析
二叉搜索树的定义 和前面一篇讨论二叉树有一点不一样,二叉搜索树它本身是一种二叉树,但是它有一个特殊的地方。任何一个二叉树中间的节点都是可以比较的。他们有一个key的值用于比较节点之间的大小。而且,对于任意一个二叉搜索树中间的节点,它左子树中间的节点值小于它,而它右子树的节点值则大于或等于它。一个典型的搜索二叉树如下图所示: 在有的情况下,我们为了实现某些方法方便会在树...原创 2013-03-22 16:23:41 · 227 阅读 · 0 评论 -
二叉树分析之一:定义和遍历讨论
简介 二叉树相关的问题和内容一直是一个比较有意思的方面。尤其是结合一些特殊的特性,比如搜索、遍历、高度等,更加让这些问题比想象的复杂。因此,对这些问题的分析也就很有必要。这里先对一些基本定义和操作做一个分析,后续会对一些其他常见的问题进行讨论。对于其中讨论的定义和方法,我们会尽力给出一个比较完备的实现。二叉树定义 从字面上来理解二叉树,则比较简单,它主要是由一系列的节点...原创 2013-03-19 11:37:21 · 296 阅读 · 0 评论 -
CLRS 11.1-4问题分析
问题描述 假定我们要在一个巨大的数组上面实现一个直接寻址的字典。因为这个数组非常的大,而且一开始可能还包含一些垃圾信息,也就是说,这个建立了的数组是没有被初始化的,它里面可能含有的值不是被都设置为0,而是可能为任意值。而且,如果从头到尾的将这个数组初始化一遍开销太大了,这样又不太现实。现在,假设我们要实现这么一个字典,里面每一个保存的对象使用O(1)的空间,保证search, ins...原创 2013-03-17 13:21:50 · 119 阅读 · 0 评论 -
java bitmap/bitvector的分析和应用
简介 bitmap在很多海量数据处理的情况下会用到。一些典型的情况包括数据过滤,数据位设置和统计等。 它的引入和应用通常是考虑到海量数据的情况下,用普通的数组会超出数据保存的范围。使用这种位图的方式虽然不能在根本上解决海量数据处理的问题,但是在一定的数据范围内,它是一种有效的方法。bitmap在java的类库里有一个对应的实现:BitSet。我们会对bitmap的引入做一个介绍,然后...原创 2013-03-15 12:15:51 · 484 阅读 · 0 评论 -
union find的一些改进和实现分析
简介 Union find是一种常用于集合各种操作的结构。主要包含有两个部分,一个是查找集合中是否包含有元素,另外一个是针对两个集合进行合并。这里的集合更多的是一种数学意义上的元素合集,在这么一个集合里没有重复的元素,但是根据元素之间的各种关系我们将一些元素合并到一个子集里,从而形成了上述的两个主要问题。在前面一篇图论相关的文章里已经讨论了union find的两种常用实现。这里针对它...2014-07-07 23:39:52 · 223 阅读 · 0 评论 -
merge sort的一些实现和变化
简介 讨论merge sort这个问题是因为它虽然看起来简单,但是针对这个问题本身的实现以及一些细小的性能提高却有很多值得注意的地方。这里不是从最初来介绍merge sort这个算法,更多的是站在它实现细节的角度来讨论一些思路。魔鬼隐藏在细节中,我们在后面的实现里一一道来。 最初实现 我们知道merge sort里的基本思路就是递归的将要排序的数组划分成两个部分,然...2014-07-06 21:25:20 · 594 阅读 · 0 评论 -
java集合类深入分析之PriorityQueue
PriorityQueue介绍 在平时的编程工作中似乎很少碰到PriorityQueue(优先队列) ,故很多人一开始看到优先队列的时候还会有点迷惑。优先队列本质上就是一个最小堆。前面一篇文章介绍了堆排序和堆的性质。而堆又是什么呢?它是一个数组,不过满足一个特殊的性质。我们以一种完全二叉树的视角去看这个数组,并用二叉树的上下级关系来映射到数组上面。如果是最大堆,则二叉树的顶点是保存的...原创 2013-03-10 18:31:14 · 673 阅读 · 0 评论 -
java stack的详细实现分析
简介 我们最常用的数据结构之一大概就是stack了。在实际的程序执行,方法调用的过程中都离不开stack。那么,在一个成熟的类库里面,它的实现是怎么样的呢?也许平时我们实践的时候也会尝试着去写一个stack的实现玩玩。这里,我们就仔细的分析一下jdk里的详细实现。Stack 如果我们去查jdk的文档,我们会发现stack是在java.util这个包里。它对应的一个大致的...原创 2013-03-07 10:18:33 · 3161 阅读 · 1 评论 -
binary search及扩展出来的几个问题讨论
简介 binary search是一个几乎大家耳熟能详的问题,只要一提到这个问题,似乎立马就有人把代码都浮现在头脑里了。它本质上就是通过不断的折半查找来缩小范围,这样可以达到一个很理想的运行效率。这个方法本身有几个小的地方值得注意。另外,通过binary search引申出来的一些问题也是各种各样,这里也针对两个比较有意思的问题做了一点分析。binary search的思路和实现...原创 2013-02-28 00:41:26 · 190 阅读 · 0 评论 -
Shortest path in complement graph
问题描述 Shortest path in complement graph.:Given a graph G, design an algorithm to find the shortest path (number of edges) between s and every other vertex in the complement graph G'. The compl...原创 2016-09-01 23:26:06 · 312 阅读 · 0 评论 -
String sort的几种方法
简介 在之前的一些排序算法中,主要是对一些数值的类型比较的比较多一点。而对于字符串类型来说,它有一些特殊的性质。如果按照传统的排序方法,对于字符串的比较性能其实还取决于字符串的长度以及相似程度。实际上,对于一些字符集的取值在一个比较小的范围内的情况,我们可以有一些比较高效率的算法。这里针对这些特殊的情况进行讨论。 假设给定的排序集合里元素,也就是每个字符都是在一个比较有限的范围里,...原创 2016-10-16 23:07:32 · 4684 阅读 · 0 评论 -
Trie树的分析和理解
简介 在使用一些搜索引擎去搜一些东西的时候,我们经常会碰到一个有意思的事情。有时候我们在搜索框输入一部分内容的时候,会发现搜索框会显示一个下拉的列表,里面有一些以前面输入的内容为开头的一系列搜索字段。比如当输入search的时候,搜索框会显示如下的内容: 如图所示,这里显示一个比较神奇的东西,网站居然可以给我们有一个自动补全的提示,这样可以省略了一些手动的输入。 那么,是什么可...原创 2017-01-05 23:22:06 · 606 阅读 · 0 评论 -
一种判断合法进出栈序列的方法
问题描述 假设我们有一组数字按从小到大的顺序执行进栈和出栈的操作,比如我们有数字0, 1, 2, 3, 4, 5, 6, 7, 8, 9。它们按照顺序混合执行push, pop操作。其中pop操作返回的数字组成一个序列。那么,当我们给定一个序列的时候,能否判断这个序列是可以通过这么一组push, pop操作形成呢? 问题分析 对于这个问题,一开始确实有点不太好分析。...原创 2015-01-11 11:17:05 · 619 阅读 · 0 评论 -
有向图的几个算法分析总结
简介 前面讨论的很多文章里,都是针对无向图进行的分析。无向图的一个特性就是其中一旦两个节点a和b是相连的,这就意味着有路径从a到b,同时也有从b到a的。它具体对应的矩阵表达方式对应着一个对称矩阵。而这里重点是考察有向图。和无向图比起来,有向图更加多了一种出入度的概念。因为方向的有向性,很多以前在无向图里看起来比较简单的问题在这里会变得更加有意思。 有向图定义 一个常用的...原创 2014-09-14 23:33:18 · 3316 阅读 · 0 评论 -
skiplist分析和应用
skiplist介绍 skiplist是一个比较又意思的数据结构,如果不是在分析一些nosql数据库的实现时,还一直忽略了它的存在。在对skiplist的详细定义和实现做讨论之前,我们可以来看看一些数据结构针对基本的增删查改等操作的时间复杂度。然后来对比它们之间性能和实现复杂程度的平衡。我们先看一个如下的表:数据结构增加删除查找修改Unsorted A...原创 2014-09-13 14:50:18 · 467 阅读 · 0 评论 -
Girth of graph
问题描述 在前面的一篇文章中我们讲述过怎么去检测一个图形中间是否有环。对于很多图来说,它们确实存在环,而且可能存在的环长度也各不相同。这里,就引入了一个概念,叫做girth。对于一个不存在环的图来说,它的girth为无穷大,而对于一个存在环的图来说,它的girth为最小的环长度。 我们以下面几个图为例: 这个图正好形成了一个环,所以它的girth值就是环的长度...原创 2014-09-08 22:09:42 · 1675 阅读 · 0 评论 -
无向图的几个基本算法应用
简介 最近在看一些图相关的问题。实际上关于图相关的研究和问题已经非常多了。在前面的几篇文章里,我也谈到过图的定义、遍历法,扩展树生成和最短路径等问题。 除了这些问题及应用以外,还有一些比较常见的问题,虽然难度不大,不过经常会在一些情况下碰到。不仔细去考虑的话还是比较难解决的。这篇文章里重点要讨论解决的几个问题分别是检测图的连通性、图中间环的检测和二分图的检测。 图的连通性...原创 2014-09-05 00:37:50 · 1048 阅读 · 0 评论 -
动态中间值的查找(dynamic median finding)
问题描述 从一组无序的数组里求它的中间值,要求定义一个数据结构,保证用常量的时间可以找到中间值,而插入一个元素的时间复杂度为O(logn),而删除中间值元素的时间复杂度为O(logn)。这个问题要求里最严格的一点是,以上的这些特性的保持是动态的。比如说,我们要输入的元素可能有1000个,但是在我输入前面的若干个元素的时候,它们也满足以上的特性。 分析 在分析这个问题...原创 2014-08-30 23:45:05 · 1596 阅读 · 0 评论 -
排列组合生成问题的讨论(三)
简介 这一部分主要讨论组合生成问题的一个应用,就是子集的生成。具体的问题要求就是给定一个集合,要求枚举出它所有可能的子集。这个问题实际上本质上还是一个组合生成问题的应用。结合前面一篇文章里所讨论的,其实我们这个问题无非就是要求出包含有1个元素,2个元素到n个元素的所有可能组合。 我们这里针对具体的一些实现方法做一个讨论。 分析 有了前面文章分析的基础,我们...原创 2014-08-26 23:31:53 · 215 阅读 · 0 评论 -
排列组合生成问题的讨论(二)
简介 在前面的文章里我们讨论了排列,全排列和可重复排列的几种实现。这里我们接着讨论组合的几种情况以及对应的实现。这些问题衍生出来的其他问题非常多,不过都有一定的套路可以遵循。这里针对这些情况一一讨论。 问题分析 具体组合的情况也有不同种。比如说我们最常见的,针对不重复的n个元素的集合a,从其中取出k个元素来(k <= n), 所有取出这些元素和位置无关,所以它...原创 2014-08-24 17:25:58 · 114 阅读 · 0 评论 -
排列组合生成问题的讨论(一)
问题描述 假设我们给定一组字符或者数字,如何求出它们的全排列或者给定个数的排列组合呢?这个问题本身看起来很简单。从以前学过的数学知识来看的话也很好表述。只是因为这个问题里牵涉到的各种条件和变化比较多,逐个讨论下来的篇幅也很大,所以打算拆成几篇文章来讨论。在这篇文章里,我们主要讨论基本的全排列和它的生成算法。 分析 这个问题我们可以采用两种不同的方式来分析和处理,一种...原创 2014-08-24 11:23:11 · 534 阅读 · 1 评论 -
堆的几个应用
简介 关于堆和PriorityQueue的思想和实现,前面的几篇文章我都有详细的描述,比如堆排序的实现和PriorityQueue的实现。在这些实现的基础上,实际上还有很多实际应用中的变体,比如在某些情况下我们会用到多路归并算法,还有一个就是在一些图算法的应用场景里,我们需要一个动态保持最小若干元素的集合。这些东西都离不开堆的思想和它们的应用。这里,我们针对这些变体的实现思路做一个详...原创 2014-08-20 00:13:23 · 186 阅读 · 0 评论 -
取球问题的博弈分析
问题描述 这是一个今天和别人讨论的时候碰到的一个问题,其实很早以前在初中读书的时候,发现一些数学竞赛也出过类似的问题。这里问题提到的是假设我们有两个人A和B,他们要轮流从100个球里面来取球出来。一个人每次只能取1到5个球,不能不取。假定A先取,我们设定取走最后几个球的人获胜,那么这其中有什么策略吗? 分析 对于这个问题,我们可以从最小的范围来往大的范围扩展。这两个人...2014-07-12 22:57:03 · 484 阅读 · 0 评论 -
一个矩阵标记的问题分析
问题描述 给定一个矩阵,假设为n * n的,我们这个矩阵里有若干个数字为1的元素。其他地方的元素值则不为1. 现在需要我们提供一个方法将里面为1的元素所在的行和列都设置成1. 同时要求算法的空间复杂度为O(1)。 分析 这个问题看起来有点容易让人混淆,因为如果我们从前往后这么一行一行的去遍历时,如果碰到一个为1的元素就直接将它所在行和列都设置成1的话。相当于将后面要...2014-07-12 18:12:44 · 386 阅读 · 0 评论 -
quick sort的几种实现
简介 之所以要写点和quick sort相关的,主要是因为我们很多时候只是关注一下某些问题的一个标准答案。实际上在我们碰到不同的情形,在原有问题的基础上做一点小小的变动,会带来更理想的结果。这里针对传统的实现,有相同元素的实现和非递归的实现做了一个探讨。 第一种实现 我们知道quick sort的过程其实描述还是比较简单的。它主要就是挑选一个中间值,通过partit...原创 2014-07-12 00:12:35 · 260 阅读 · 0 评论 -
Boyer Moore算法分析总结
简介 在之前的文章里,对于字符串的搜索算法,我曾经讨论过KMP算法的思路和实现。 KMP算法的实现思路是基于模式串里面的的前缀和后缀匹配,这种算法的效率已经足够快了。没想到的是,这里我们要讨论的Boyer Moore算法效率更加惊人。 思路分析 在之前的算法里,我们是通过从模式串的开头到结尾这么一个个的去和目标串比较,这种方式在碰到匹配的元素时则继续比较下一个,在没...原创 2017-03-31 18:42:27 · 542 阅读 · 0 评论 -
反转单链表
简介 这是一个相对比较简单直接的问题。假设我们有这么一个单链表,需要将它反转过来。对它分析的过程结合图的形式来看会比较清晰直观一点。 分析 我们要通过遍历的方式来反转链表,那么就需要考虑每次反转的时候需要将当前元素指向它原来的前面一个元素。因此,我们需要有一个变量来保存要反转元素的前面一个元素。另外,我们在遍历的时候,要调整当前元素时,为了能够找到后面的结点,需要用...原创 2013-02-16 13:44:16 · 189 阅读 · 0 评论 -
Bitonic search
简介 Bitonic search是一个和binary search比较类似的一种查找方法,不过它的过程会显得稍微复杂一点。从某种角度来说,它和我前面这篇文章里讨论过的一种binary search的一个变体很像,不过就是因为一个小小的变化,它们的解决办法就有着极大的差别。我们先来看看问题本身的描述: 一个bitonic数组是由一个递增的整数序列后面接着一个递减的序列,假设...原创 2014-06-29 14:29:24 · 459 阅读 · 1 评论 -
2-sum, 3-sum, 4-sum问题分析
简介 2-sum, 3-sum这两个问题其实都比较简单。他们演化的思路需要稍微费一点转折,不过当明白其中的一个诀窍之后后面的各种变形也都很简单了。最早牵涉到这个问题还是在12年我们组织面试招人的时候,海涛同学出了个这样的问题,求满足等式a^3 + b^3 + c^3 = d^3 的所有a, b, c, d值。其中a, b, c, d所在区间为[1, 100000]。对于这种问题,似...原创 2014-06-26 20:56:23 · 1003 阅读 · 0 评论 -
0-1背包问题和部分背包(fractional knapsack)问题分析
简介 背包问题已经是一个很经典而且讨论很广泛的算法问题了。最近学习到这一部分,打算结合自己思考和编码的过程做一个思考总结。这里主要讨论的0-1背包问题和部分背包问题解决方法背后其实隐藏了两种我们比较常见的算法解决思路,动态规划和贪婪算法。正好通过这两个问题的讨论可以好好的加深一下理解。 问题描述 假设我们有n件物品,分别编号为1, 2...n。其中编号为i的物品价值...原创 2014-01-27 15:38:20 · 2422 阅读 · 0 评论 -
Josephus环问题的讨论
简介 最早碰到这个问题是在读大学刚开始学数据结构的时候。还记得当年为了验证自己的一种思路连续调试了好几天,最后虽然得出了一个结果,不过算法的时间复杂度达到了O(n^3)。现在回顾起来挺有意思的。 问题分析 Josephus环的问题看起来很简单,假设有n个人排成一个圈。从第一个人开始报数,数到第m个人的时候这个人从队列里出列。然后继续在环里数后面第m个人,让其出列直到...原创 2014-01-18 22:51:36 · 810 阅读 · 0 评论 -
All paths in a graph
问题描述 给定一个图中间两个节点,我们需要返回这两个节点之间所有的simple path。什么是simple path呢?就是图中间不包含有重复节点的路径。 问题分析 对于这个问题,我们比较容易想到一些和其他问题近似的地方。比如说给定两个节点要判断它们是否连通。而且在连通的时候我们可以找到一条这两个节点之间的路径。对于这个相对简化的问题来说,我们可以通过图的某种遍历方式,每...原创 2016-07-26 22:16:02 · 189 阅读 · 0 评论 -
Deletion order
问题描述 给定一个连通的图,确定一个删除节点的顺序,使得每次删除节点之后图的剩余部分依然是连通的。要求算法的时间复杂度是O(V + E)。 分析 这个问题粗看起来比较复杂。因为对于一个图来说,假设我们要删除一个节点,那么它所对应的边都要被删掉。光去遍历所有的节点找到所有包含某个要删除节点的边都要费很大的劲。所以不能单纯的用一个个查找然后删除的方法。 我们来看这个问题的...原创 2016-07-25 23:18:27 · 167 阅读 · 0 评论 -
k路归并算法的分析和实现
问题描述 将k个已经排序的数组归并成一个大的排序的结果数组。这些数组可能数量比较大,以至于不能直接装载到内存中。 这个问题比较有意思。后面一截的描述是我个人加上去的。实际上一个简单的模型就是将k个已经排好序的数组或者序列合并成一个排好序的结果数组。那么我们该怎么来考虑这个问题呢? 初步分析 其实这个问题可以说是一个问题的更加普遍形式。回顾一下我们在讨论归并...原创 2014-01-08 00:16:30 · 1606 阅读 · 0 评论