非常に大きなデータ セット (100,000 要素から 250,000 要素の範囲) があり、現在、一連の単語を検索する目的でデータをベクターに格納しています。フレーズ (例: "on, para") を指定すると、関数は指定されたフレーズで始まるすべての単語を検索し、すべての一致をキューにプッシュする必要があります。
最初の単語を見つけるために、うまく機能しているように見えるバイナリ検索を使用していますが、最初の単語が見つかった後、行き詰まります。要素の前後を効率的に反復して、類似したすべての単語を見つけるにはどうすればよいですか? 入力はアルファベット順に並べられているため、要素が返される前または後に他のすべての一致が発生することがわかっています。<algorithm>
たぶん、私が利用できる機能があるに違いないと感じています。関連するコードの一部を次に示します。
二分探索機能:
int search(std::vector<std::string>& dict, std::string in)
{
//for each element in the input vector
//find all possible word matches and push onto the queue
int first=0, last= dict.size() -1;
while(first <= last)
{
int middle = (first+last)/2;
std::string sub = (dict.at(middle)).substr(0,in.length());
int comp = in.compare(sub);
//if comp returns 0(found word matching case)
if(comp == 0) {
return middle;
}
//if not, take top half
else if (comp > 0)
first = middle + 1;
//else go with the lower half
else
last = middle - 1;
}
//word not found... return failure
return -1;
}
のmain()
//for each element in our "find word" vector
for (int i = 0; i < input.size()-1; i++)
{
// currently just finds initial word and displays
int key = search(dictionary, input.at(i));
std::cout << "search found " << dictionary.at(key) <<
"at key location " << key << std::endl;
}