随笔分类 - 算法证明
摘要:按:今天看Tanenbaum的计算机网络时讲到了Dijkstra算法。关于算法的正确性,《算法导论》给出了严格的证明。CLRS的证明基于一个通用的框架,非常清晰。今天只是随意想想是否有其他证明的方式,结果发现是有的。虽然这种证明方法可能早已有人用过,不算新鲜。不过自己想了一通就把它放到这里纯粹博大家...
阅读全文
摘要:今天在看代码源文件求diff的原理的时候看到了LCS算法。这个算法应该不陌生,动规的经典算法。具体算法做啥了我就不说了,不知道的可以直接看《算法导论》动态规划那一章。既然看到了就想回忆下,当想到算法正确性的时候,发现这个算法的正确性证明并不好做。于是想了一段时间,里面有几个细节很trick,容易陷进...
阅读全文
摘要:在看《信息检索导论》的时候看到了这个算法的实现,书里是用来演示如何将两个term的倒排列表求交集。伪代码如下:INTERSECT( p1, p2)1 answer ← {}2 while p1 != NIL and p2 != NILdo3 if docID( p1) = docID( p2)th...
阅读全文
摘要:引言:Floyd-Warshall算法作为经典的动态规划算法,能够在O(n3)复杂度之内计算出所有点对之间的最短路径,且由于其常数较小,对于中等规模数据运行效率依然可观。算法共使用n此迭代,n为顶点个数。其中第k次迭代计算出每对顶点之间所有中间结点小于等于k的最短路径长度,其中i到j的最短路径要么是...
阅读全文
摘要:KMP算法是非常经典的字符串匹配算法,而且有可能是最经典的一个。同时它也是非常典型的一种优化算法,它把原本暴力法O(mn)的最坏复杂度降低到了O(m+n)(虽然实际上暴力法的执行复杂度期望依然是线性的),其思想非常具有典型性和可借鉴性,值得好好学习。1 基本思想KMP算法的基本思想是,借助一个预先计算好的数组pi,在匹配了一定数量的模式的情况下,遇到不匹配的字符时,不像暴力法那样将待匹配的文本下标从上一次匹配的地方向后移动一个位置,并将已匹配的模式个数清零,而是利用已经匹配部分的信息,迅速跳过那些不可能匹配成功的文本开头,减少了暴力法中一些不必要的盲目搜索。比如,对于模式0 1 2 3 4 5
阅读全文
摘要:关于LIS(Least Increasing Subsequence,可译为最长递增子序列、最长上升子序列),其O(n2)和O(nlgn)的算法可以见博文[1][2]。O(n2)的算法很早之前就听说,不算新鲜,但O(nlgn)的算法还是第一次听说,觉得很新鲜,也很牛。既然很多人都引用了这个算法我相信...
阅读全文
摘要:重复题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。此题最初载于http://blog.csdn.net/v_JULY_v/article/details/6444021我在文章中也对其做了总结,并对线性时间的算法做了自己的证明,这里重复如下(其实后面的递归式本身就证明了算法的正确性,这里只是希望通过暴力的方法尝试对从另一个方面对它进行证明,即穷举所有可能出现情况):“关于这道题的证明,我的思路是去证明这样的扫描法包含了所有n^2种情况,即所有未显示列出的子数组都可以在本题的扫描过
阅读全文

浙公网安备 33010602011771号