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 )
    }

2つの部分があります...

  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]、長さの辞書からの単語の 1 行も同様です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++ は m に +1 を追加し、m-- は m に -1 を追加するため、たとえば次のように呼び出すことができます。

 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 に答える