技术 · 阅读记录
2017之这是如何做到的?
有时候,我们很想知道,这是如何做到的。在这里,将记录一些突然想知道的一些问题。
两个文件差异化问题
时间:2017-04-13
晚上,阅读《Pro Git》中文版,遇到了这句“如果想要看当前版本的文件和一个月前的版本之间有
何差异,Git 会取一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这
件事,或是把老版本的文件拉到本地来做比较。”。当时内心极其想搞明白如何实现这种文件间的**
差异运算**是如何实现的。这也导致了这篇博文的产生。
零时解决方案
如果给我这个问题,让我来实现。我会如何做?
苦思冥想,想到了一个思路。
前提:把文件中的行作为一个元素,这样文件就转换为字符串间的差异化运算了。
具体内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
INPUT: str1, str2
int i = j = 0
while i < str1.length || j < str2.length
if str1[i] == str2[j]
i++; j++
else if str2[j+] contain str1[i] && str1[i+] is not contain str1[i]
print ....
j = str2.index(str1[i],j)
i++
else
i++
if i < str1.lengt
print ...
else if j < str2.length
print ...
该思路还是有问题的,待进一步考虑
进一步的解决方案
对于字符串的差异运算。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
INPUT: str1, str2
init list
for item1, i : str1
for item2, j : str2
if item == item2
list.add(i,j)
// 这里的差异运算就转换求最长的子队列长度
// 要求队列中的任意元组,其元素均要大于排在其前面的元素大小
// list = [(1,2), (1,3), (1,4)]
init result
for (i,j) : list:
if isUse (i,j) list
result.add(i,j)
isUse (i,j) list
next = (i+1, j+)