user-0 提问: 文本比较算法，给点建议

回复:
user: user-0
content: 引用 21 楼 u013061236 的回复: 看LZ的需求，基本上是要在B中查找与A的最大匹配位置吧 最大匹配，次大匹配，第三大匹配.......无匹配！ 把A整个拆分了

user: user-0
content: 引用 20 楼 hepeizhong2010 的回复:[quote=引用 19 楼 N_sev7 的回复:] [quote=引用 17 楼 lm_whales 的回复:] 可以先分8次匹配，每次用字节模式匹配处理需要时,额外检测下，两头两个字节，就可以了 没太明白，其实我的数据是位流， 不是字节流， 所以单纯的比较字节的话是不行的 [/quote] 把短的位流移位7次，不就得到8个字节流的字符串了么 然后8个字符串分别用KMP去匹配就好了[/quote] 我就是这样处理的，只不过还有其他要求，比如得到的中间文件（A串所有的子串在B中的位置）等 还有中间文件要压缩，争取做到最小

user: user-1
content: 看LZ的需求，基本上是要在B中查找与A的最大匹配位置吧

user: user-2
content: 引用 19 楼 N_sev7 的回复:[quote=引用 17 楼 lm_whales 的回复:] 可以先分8次匹配，每次用字节模式匹配处理需要时,额外检测下，两头两个字节，就可以了 没太明白，其实我的数据是位流， 不是字节流， 所以单纯的比较字节的话是不行的 [/quote] 把短的位流移位7次，不就得到8个字节流的字符串了么 然后8个字符串分别用KMP去匹配就好了

user: user-0
content: 引用 17 楼 lm_whales 的回复:可以先分8次匹配，每次用字节模式匹配处理需要时,额外检测下，两头两个字节，就可以了 没太明白，其实我的数据是位流， 不是字节流， 所以单纯的比较字节的话是不行的

user: user-0
content: 引用 16 楼 xiayuanzhong 的回复:你可以看看HexWorkshop的“文件重新同步比较”功能，有时候很准，有时候就很不准。 估计是没有一个好的算法能实现这个功能。 自己写了一个二分+KMP的算法实现了已经 不过当两个文件差别特别大时， 基本上就有些跑不动的感觉了 有待优化

user: user-3
content: 可以先分8次匹配，每次用字节模式匹配处理需要时,额外检测下，两头两个字节，就可以了

user: user-4
content: 你可以看看HexWorkshop的“文件重新同步比较”功能，有时候很准，有时候就很不准。 估计是没有一个好的算法能实现这个功能。

user: user-5
content: 仅供参考//有一个二进制文件，要求每隔50bits，删除后面的12bits。 #include <stdio.h> #include <stdlib.h> #include <string.h> FILE *fi,*fo; char buf[31]; char obf[31]; int bn,n; void filter() {//对buf中前n个字节中的位，每隔50bits，忽略12bits，结果放在obf中,且将bn设置为obf中的字节数。     char bit[249];     char obt[249];     char b8[33];     char b88[33];     int i,j;     char *e;      for (i=0;i<n;i++) {         _itoa(buf[i],b8,2);         sprintf(b88,"%032s",b8);         sprintf(bit+i*8,"%s",b88+24);     }      j=0;     for (i=0;i<n*8;i++) {         if (i%62<50) {             obt[j]=bit[i];             j++;         }     }     if (j%8) {         bn=(j/8+1)*8;     } else {         bn=j;     }     for (i=j;i<bn;i++) obt[i]='0';     obt[bn]=0;     bn=bn/8;     for (i=0;i<bn;i++) {         strncpy(b8,obt+i*8,8);b8[8]=0;         obf[i]=(char)strtol(b8,&e,2);     } } int main() {     fi=fopen("in.bin","rb");     if (NULL==fi) {         printf("Can not open file in.bin!\n");         return 1;     }     fo=fopen("out.bin","wb");     if (NULL==fo) {         fclose(fi);         printf("Can not open file out.bin!\n");         return 2;     }     while (1) {         n=fread(buf,1,31,fi);         if (0==n) break;         filter();         fwrite(obf,1,bn,fo);     }     fclose(fo);     fclose(fi);     return 0; }

user: user-0
content: 引用 3 楼 zhuobattle 的回复:[quote=引用 2 楼 N_sev7 的回复:] [quote=引用 1 楼 zhuobattle 的回复:] 文件不大的话，全部读入。 文件较大，则分段读入。 对两块内存做XOR，0的部分就说明相等，1的部分说明有差异。 这个不是那么简单 比如，原始文件为：10011010       最新文件为：010011010 因为原始文件多了一个Bit，导致后面很多不一样，但是，实际上呢 ，唯一不一样的地方只是新文件多了最前面的一个Bit而已  还是要谢谢你的回答[/quote] 找到xor差值最小的那个情况？[/quote]  难道一位以为的移动着去异或么？页可能文件中间出现不一样的！而且我需要将不同和相同的地方做标记，比如说哪里不一样，不一样的内容是什么，多大，如果一样，那么一样的位置在哪里，多大块一样的！  请问还有好的想法没？谢谢

user: user-6
content: 引用 2 楼 N_sev7 的回复:[quote=引用 1 楼 zhuobattle 的回复:] 文件不大的话，全部读入。 文件较大，则分段读入。 对两块内存做XOR，0的部分就说明相等，1的部分说明有差异。 这个不是那么简单 比如，原始文件为：10011010       最新文件为：010011010 因为原始文件多了一个Bit，导致后面很多不一样，但是，实际上呢 ，唯一不一样的地方只是新文件多了最前面的一个Bit而已  还是要谢谢你的回答[/quote] 找到xor差值最小的那个情况？

user: user-0
content: 引用 1 楼 zhuobattle 的回复:文件不大的话，全部读入。 文件较大，则分段读入。 对两块内存做XOR，0的部分就说明相等，1的部分说明有差异。 这个不是那么简单 比如，原始文件为：10011010       最新文件为：010011010 因为原始文件多了一个Bit，导致后面很多不一样，但是，实际上呢 ，唯一不一样的地方只是新文件多了最前面的一个Bit而已  还是要谢谢你的回答

user: user-6
content: 文件不大的话，全部读入。 文件较大，则分段读入。 对两块内存做XOR，0的部分就说明相等，1的部分说明有差异。

user: user-7
content: 引用 13 楼 misakamm 的回复:这个叫“最短编辑距离”，但实际应用里面，会使用分行的方式和局部贪心的做法降低时空复杂度 是炮姐吗??

user: user-0
content: 引用 13 楼 misakamm 的回复:这个叫“最短编辑距离”，但实际应用里面，会使用分行的方式和局部贪心的做法降低时空复杂度

user: user-8
content: 这个叫“最短编辑距离”，但实际应用里面，会使用分行的方式和局部贪心的做法降低时空复杂度

user: user-0
content: 引用 8 楼 richyhuang 的回复:[quote=引用 7 楼 user-9 的回复:] 首先你要定义差异 你不能说多了一个字符“我认为”差异就很小。 有的时候多一个字符，一样完全变了。 对于计算机也一样，我觉的楼主这个应该先定义patten再进行比较。[/quote]  其实，我就是用KMP迭代去找的

user: user-0
content: 引用 7 楼 user-9 的回复:首先你要定义差异 你不能说多了一个字符“我认为”差异就很小。 A:10011010 B:010011010 我的比较结果就两条记录 第一条记录 B的第一个Bit 0单独做标记 B的后面的所有Bits是一条记录，记录和A的从0开始到第七位一样  可能我表述的不太对吧 上面是我想要做的！

user: user-0
content: 引用 6 楼 ForestDB 的回复:最大匹配？？ 嗯，就像文件比较工具一样，一般文件比较工具都是字节为最小单位，我这只是需要将字节转为Bit流进行比较 比如上面的例子中的 A:10011010 B:010011010 我的比较结果就两条记录 第一条记录 B的第一个Bit 0单独做标记 B的后面的所有Bits是一条记录，记录和A的从0开始到第七位一样

user: user-9
content: 引用 8 楼 richyhuang 的回复:[quote=引用 7 楼 user-9 的回复:] 首先你要定义差异 你不能说多了一个字符“我认为”差异就很小。 有的时候多一个字符，一样完全变了。 对于计算机也一样，我觉的楼主这个应该先定义patten再进行比较。[/quote]  楼主其实已经说了在比特的的前提下进行比较，但是还是会有很多问题，如何制定差异，必须要有一个度量方法，计算机不会模糊处理