0

如果没有所有重复,我将如何编写此代码

    // I have a loop which decrements m each time
    // set m to the starting point
    m = mid
    // set f to a calculated array value
    f = dict[l].substr( l * --m, l )
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){
        matches.push(f);
        // same as what was defined outside the while loop
        // which seems to me like unnecessary repetition
        f = dict[l].substr( l * --m, l )
    }
    // then I repeat it all, but incrementing m
    // reset m to the starting point
    m = mid
    f = dict[l].substr( l * m++, l )
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){
        matches.push(f);
        f = dict[l].substr( l * m++, l )
    }

有两个部分...

  1. 每个块包含一个重复f = ...部分
  2. 块重复,只改变增量/减量m

编辑:代码的作用...

mid表示按字母顺序排序的固定长度单词列表的任意入口点,没有分隔符. 我的目标是列出与集合前缀匹配的所有单词,因此必须找到任意mid点的所有单词(通过二进制搜索方法输入)并向前查找。


编辑:更多细节......

字典看起来像这样:

dict = [
  "", // offset other values to equal word length
  "ai",    // all length 1
  "inatonuptogo",    // all length 2
  "catcrydogendgodhamhathit",    // all length 3
  "foodhackhallhandhardhatehatshavehellridewood" // all length 4
]

l是搜索词的词长,所以dict[l]是字典中的一排词,长度为l

我正在修改John Resig 的二进制搜索方法,以便它匹配前缀而不是整个单词,并返回一组结果,而不是真实值。我也在其中设置了一个限制,因为我将把它用于自动完成功能,它只需要几个返回值,而不是所有匹配项。

4

3 回答 3

2

您可以将循环拉入一个函数,因为除了递增/递减之外,它们是相同的:

function helperFunction(m, f, l, mid, dict, matches, limit, increment)
{
    m = mid;

    if (increment)
        f = dict[l].substr(l * m++, l);
    else f = dict[l].substr(l * --m, l);

    while (f.substr(0, x) === word && (!limit || matches.length < limit))
    {
        matches.push(f);
        f = dict[l].substr(l * m, l);

        if (increment)
            f = dict[l].substr(l * m++, l);
        else f = dict[l].substr(l * --m, l);
    }
}

我已经在参数列表中包含了所有变量,因为它们的范围不清楚。

于 2012-07-10T22:47:17.877 回答
2

把它放在一个函数中并传入一个增量。由于 m++ 将 +1 添加到 m 并且 m-- 将 -1 添加到 m,因此您可以调用例如:

 function foo(mid, dict, delta) {
 m = mid
 //   f = dict[l].substr( l * m += delta, l )
    f = dict[l].substr( l * m, l );
    m += delta;
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){
        matches.push(f);
        // f = dict[l].substr( l * m += delta, l )
        f = dict[l].substr( l * m, l );
        m += delta;
    }
    return matches;
}

matches = foo(mid, dict, -1);
matches = foo(mid, dict, +1);

我只是将匹配项作为返回值提取出来,因为我不确定您的代码正在尝试做什么,但它应该向您展示这个想法。

于 2012-07-10T22:47:44.833 回答
0

@Billy Moon,您可以在下面验证此代码吗?

function foo(flag, m) { return dict[l].substr( l * (Boolean(flag)) ? --m : m++), l ); }
var flag = 1;
do {
    m = mid
    f = foo(flag, m)
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){
        matches.push(f);
        f = foo(flag, m)
    }
    flag--;
} while(flag > -1)

我希望可以帮助你。

于 2012-07-11T20:49:38.143 回答