1

ホームページを見ましたが、下記の件について直接の回答はありません。

C++で文字列内の部分文字列のn番目の出現を見つける最も効率的な方法は何ですか?

次の例は、2 番目のオカレンスを見つける方法を示しています: http://www.cplusplus.com/reference/string/string/find/

しかし、最初の一致を最初に見つけてから、その場所を使用して次の一致を検索するなど、n番目の一致を見つけるのは非常に効率が悪いようです。第25試合の順位が欲しいのですが、もっと早い方法はありますか?

編集:より大きなコンテキストでは、ファイルを 1 行ずつ読んでいます。項目へのすべての応答にはスコアがあり、一部は欠落しており、NA文字列を取得しています。すべての項目はスペースで区切られています。

特定の項目を除外するオプションが必要なため、項目 35 から 80、90 から 120、および 150 から 200 のみを検索します。だから私が現在していることはこれです:

string blockedLine(string line)
{
  int b_start[] = {35, 90, 150};
  int b_end[] = {80, 120, 200};
  std::vector<int> space_matches = KMP(line, " ");
  string cuttedLine = "";
  for (int i = 0; i < 3; i++)
    {
      cuttedLine.append(line.substr(space_matches[b_start[i]],
                                    space_matches[b_end[i]]));
    }
  return(cuttedLine);
}

コメントの1つに記載されている関数はどこKMPにありますか。これにより、スペースの発生位置が取得され、space_matches.

NA次に、この追加された文字列での出現回数を数えます。問題は、この追加がなければ、行全体を読み取るだけで、約 20 万行で 1 秒しかかからないということです。この追加メソッドを使用して部分文字列を取得すると、14 秒かかり、遅すぎます。

これをスピードアップするための改善点は何ですか?

4

1 に答える 1