すべての重複なしでこのコードをどのように記述しますか
// 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つの部分があります...
- 各ブロックには繰り返し
f = ...
部分が含まれています - ブロックが繰り返され、増分/減分のみが変更されます
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 の二分探索法を変更して、単語全体ではなく接頭辞と一致し、真の値ではなく一連の結果を返すようにしています。また、すべての一致ではなく、いくつかの戻り値のみを必要とするオートコンプリート関数にこれを使用するため、そこに制限を設けています。