惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
Recent Announcements
Recent Announcements
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
J
Java Code Geeks
V
V2EX
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
博客园 - Franky
爱范儿
爱范儿
T
Tailwind CSS Blog
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
博客园_首页
B
Blog RSS Feed
博客园 - 司徒正美
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - 尉迟方

华容道研究 - 华容道资料大全 - 华容道完全求解 最近做的在线游戏:华容道(53关),界面古朴典雅,过关过程可回放 zz代码发芽网更新 - 界面清晰、支持论坛(Discuz!)、一键复制HTML/BBcode 代码发芽网更新了22个颜色主题zz 代码发芽网(Beta版)发布,欢迎测试、试用zz 如何编写PocketPC上的输入法 如何向目标窗口发送一个Unicode 字符? firefox使用技巧 - 公司内部站点 决定搬家到 http://www.2maomao.com/blog/ ,这里以后只更新一些技术问题 如何搞定Bluehost.com上面wordpress中文版 整理了一下IE的右键菜单 - 直接禁止add on,爽 猛烈推荐开源编辑器notepad2,替换notepad 搞笑创意 zz 消遣一下:这舞跳的真tmd绝了 Bill Gate & Microsoft Windows's *BLUE* time. 中国工商银行网上银行,客户权利那么少,义务那么多,敢开吗? C# String 的问题:immutable why? how? 传值?传引用?string/String? 争论webos是否是os有什么意义? 以前看古龙时的选摘
如何实现快速的diff工具(windiff, winmerge)?
尉迟方 · 2006-08-10 · via 博客园 - 尉迟方

问题可以简化,每一行的字符串可以看成一个值,问题简化为求解两个整型数组的连续序列问题。

初步搞定之:Windiff 原理初探, 采用动态规划算法找最优解,不考虑交叉情况。

Update1:
经实验证明,在文件非常长的时候此算法非常之慢

比如10k个文件,这样就会有个10k x 10k的int数组,内存一次性耗掉有400M之多,计算量庞大无比到了难以承受的地步。

我监测了一下windiff,人家在100k大小的两个文件比较只用了一秒多,内存最多时不超过50M。

一定有更好的解法。

今天路上和朋友讨论一下,有以下几种思路:
1、贪心算法
2、贪心算法 + 部分动态规划
3、被比较对象每行的重复率很低,这个信息可能会有用。

Update2:
使用思路1的分析以及程序基本完成,效果显著,详细分析与程序流程图参见文章:Windiff 原理初探(续1)

程序运行结果对比:
我用C++在WindowsXP下实现这个程序,AMD2500+/512内存,Release版,删除printf输出(这里只算分析时间)以后,对两个12万行的文本做diff跑了10秒不到。
我试了一下WinMerge,不算其界面操作时间(即只算到分析结束,他后来死翘翘了),应该在5秒之内
不过,好像Windiff更快,一秒都不到,结果我打开一看,丫好像全错了:(,各位可以试试看,将1, 2, 3, 4, 5, 6, 7, 8每个数字一行然后重复这些行直到10万行,另一个文件用1, 2, 2, 4, 6, 6, 5每个数字一行然后重复到10万行,反正我机器VS2005的Windiff分析结果飞快,结果是这两个文件没有一行相同 :o ,汗一个

有没有更好的方法?上文里面提到的想法里面,想法2会优化结果,速度可能反而会慢一些,想法3应该是值得考虑的因素。

程序代码(估计有许多小bug):http://www.2maomao.com/blog/wp-content/uploads/mydiff.cpp.html