许多“文本比对程序”为了使比对完成后,两边“对应的行”能够对齐,采取了“插入空行”或“添加连线”等方法。(图一和图二的出处:本网站博文:文本对比,文本差异并排对比显示实现 博主:西凉的悲伤 2021-12-07 首次发布 2023-10-10 修改)
看图一:为了使两边“对应的行”能够对齐,两边都插入了不少的空行。虽然是对齐了,但原本连续、流畅的程序段变得支离破碎,大大降低了可读性。
看图二:在两边“对应的行”之间,用彩色的细曲线连接起来。有些地方还算清晰,而有些地方就显得一团糟,使人眼花缭乱。
我的设计方案是:“灵活对齐”(两边都有滚动条),就是把“想要关注的语句行区域的两边对应首行”----自动选中并对齐,以方便对这部分的语句段进行分析。这样,既不用插入空行,也不用添加连线。避免了上面提到的弊端。
操作的方法也很简单:
1.拉下“编辑步骤”,选择第几步编辑,就可以把该次编辑的“第1行”两边对齐了。(无论这些行之前躲在哪里,都会自动现身并自动选中并对齐,也就是“垂直滚动条”会自动上下移动。)
2.或者在某个“关注行”上,任意选中1-10个字符就完成了。(这时,另一窗口的对应的行,也会自动现身并自动选中并对齐。)
理论依据和设计方法简叙如下:
1.我们把文本A与文本B进行对比,其实是把“文本A转变为文本B的(最短编辑距离的)编辑步骤”进行追述、记录并展现出来。
2.在我的程序中,是通过2个二维的数组:QS()和CD()来记录的。它们的值(元素)记录了每一步编辑的“起始行号”(QS)和“行数”(CD);第1维指出是“哪个文本”(左边0、右边1)。第2维是关键的,表示编辑的序号(第几步编辑),正是它把左右2个文本关联、对齐起来了。当使用者下拉“编辑步骤”选择,或者选中某行中几个字时,程序就可以根据“行号”推算出是“第几步编辑”,于是就可以推算出另一个文本的相应的信息了。
3.文本比对算法绕不开“最短编辑距离”或者“最长公共子序列”的算法,我用的是“最长公共子序列”的“递归”算法,所以时间复杂度较大。对于行数太多的文本,计算时间就会较长。
4.编程中,我前几日刚想到的一个方法是:当程序已经算出是“第几步编辑”后,在“自动选中”之前,把左右2个文本框向上缩小至1行。这样一来,程序根据QS()的值移动光标,对应的行就自动移动到了2个文本框的顶部。之后可以再展开、还原2个文本框……。这个过程极快,使用者根本觉察不到。
几点说明:
1.这是我第一次编制“以行为单位”的文本比对程序。(以前编制过“以字符为单位”的、就是“文章形式”的文本比对程序:“最长公共子序列”的实际应用案例 发表在本网站,免积分下载。) 按“行”比对与按“字”比对两者的比对算法是一样的。区别是:以字符为单位的话,按字符在文本中的“位置”来取字;而以“行”为单位的话,就先把行放入一维数组,然后按“下标”来取行。后面的算法是一样的。
2.这个程序不需要任何OCX控件,更不需要什么“库”,程序只有一个exe文件,可以在Win系统下直接运行。为了避免使用 OCX控件,在两边输入数据时,不采用“打开”菜单或按钮,而是用“粘贴”的方法(这样也带来不便,抱歉)。
3.由于使用的是普通的文本框,无法加颜色,所以“行与行之间”只判断“同或不同”,不计算“不同行的差异细节”。因为“差异细节”只能用不同颜色来表示,这与前面图一、图二的几个比对程序不同,也是本程序的一个不足。但是在我看来,既然“修改过的行”已经在行首做了“标记”,而且两边又对齐了,它们之间细微的差别还是容易发现的。(这是个人所见)
4.由于自己试用的次数不够多,因此如果读者在使用时发现有错误或者不妥,敬请留言指出,真诚感谢!