文本比对--比对结果“两边灵活对齐”

    许多“文本比对程序”为了使比对完成后,两边“对应的行”能够对齐,采取了“插入空行”或“添加连线”等方法。(图一和图二的出处:本网站博文:文本对比,文本差异并排对比显示实现   博主:西凉的悲伤  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.由于自己试用的次数不够多,因此如果读者在使用时发现有错误或者不妥,敬请留言指出,真诚感谢!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值