首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Diff算法,即最短编辑图路径

Diff算法,即最短编辑图路径
EN

Stack Overflow用户
提问于 2012-03-02 06:56:13
回答 1查看 265关注 0票数 4

我正在尝试理解著名的“diff”论文here中的算法,它运行在两个命令行参数中的字符上。但是,我的代码没有产生我期望的结果。我已经编写了算法来尽可能地匹配它们的变量:

代码语言:javascript
复制
$ ./diff abbcabba cbabac #Hmm.. I think it should be 5
SES: 10  
$ ./diff abcdefg abcdefg #0! Great!
SES: 0
$ ./diff abcXefg abcYefg # 2 seems reasonable
SES: 2
$ ./diff abcXefg abcefg # clearly wrong
SES: 7

以下是我的代码(很抱歉,代码之墙):

代码语言:javascript
复制
    a = argv[1];
    b = argv[2];
    alen = strlen(a);
    blen = strlen(b);
    tlen = alen + blen;
    maxd = tlen;

    vp = (int *)calloc(2 * maxd + 1, sizeof(int));

    // How I'm thinking about pointer arithmetic:
    // vp in [0, 2*maxd + 1) == [0, 2*maxd]
    // v  in [-maxd, maxd + 1) == [-maxd, maxd]
    v = vp + maxd;
    v[1] = 0;
    for (D = 0; D <= maxd; D++) {
            for (k = -D; k <= D; k += 2) {
                    if (k == -D || (k != D && v[k-1] < v[k+1])) {
                            x = v[k + 1];
                    } else {
                            x = v[k - 1] + 1;
                    }
                    y = x - k;
                    while (x < alen && y < blen && a[x] == b[x]) {
                            x++;
                            y++;
                    }
                    v[k] = x;
                    if (x >= alen && y >= blen) {
                            printf("SES: %d\n", D);
                            goto out;
                    }
            }
    }
    printf("Nothing found. SES > %d\n", maxd);

你知道这里的缺陷在哪里吗?我发现在网上搜索这个问题非常困难……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-02 07:23:49

看起来问题出在下面这一行:

代码语言:javascript
复制
while (x < alen && y < blen && a[x] == b[x]) {

这里的b[x]应该是b[y],它提供了:

代码语言:javascript
复制
while (x < alen && y < blen && a[x] == b[y]) {

有了这个改变,你的例子的结果是6,0,2和1。这似乎是准确的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9525528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档