0

これが私の実装ですが、テキストファイルを分析するときは少し遅いです.誰かがランダム書き込みを実装するためのより良いアイデアまたはより良いデータ構造を持っていますか? 私は STL ライブラリを使用していないので、構文について心配する必要はありません。push_back を使用する代わりに、ベクトルは .add を使用しています。

randomInteger は、範囲間のランダムな整数を生成します

出来れば2000キャラ制作したいです。

ファイルを 1 文字ずつ読み取るのが最も遅い部分だと思います。

void generateText(int order, string initSeed, string filename){
    Map<string , Vector<char> > model;
    char ch;
    string key;
    ifstream input(filename.c_str());
    for(int i = 0; i < order; i++){
        input.get(ch);
        key+=ch;
    }
    while(input.get(ch)){
        model[key].add(ch);
        key = key.substr(1,key.length()-1) + ch;
    }
    string result;
    string seed = initSeed;
    for(int i = 0;i<2000;i++){
        if (model[seed].size() >0) {
            ch = model[seed][randomInteger(0, model[seed].size()-1)];
            cout << ch;
            seed = seed.substr(1,seed.length()-1) + ch;
        }
        else
            return;
    }
}
4

2 に答える 2

1

時間がかかりすぎていることを確認する必要があります。(このコードが平均的なラップトップで 1 秒以内に実行されないのはなぜですか?)

その場合は、プロファイルする必要があります。

たとえば、可能性の高い候補は、乱数を生成するコストです...

あなたはプロファイリングによって私を反証するだけです;)

于 2012-06-28T07:48:38.607 に答える
0

分析フェーズ中に一時的な文字列がたくさん作成されるため、少し遅いと思います。

for(int i = 0; i < order; i++){
    input.get(ch);
    key+=ch; // key = key + ch, at least one new string created
}
while(input.get(ch)){
    model[key].add(ch); // key copied to hash table
    key = key.substr(1,key.length()-1) + ch; // a couple of temp strings created
}

代わりに次のようにすることもできます:

char key[order + 1]; // pseudo code, won't work because order is not constant
key[order] = 0; /* NUL terminate */
for (int i = 0; i < order; i++) {
    input.get(key[i]);
}
while (!(input.eof())) {
    for (int j = 0; j < order - 1; k++) { 
        key[j] = key[j + 1];
    }
    input.get(key[order]);
    model[key].add(ch);
}

ここで実際に作成される唯一の文字列は、最終的にハッシュ テーブルのキーとなる文字列です。キーは単純な文字配列でローテーションされ、一時的な文字列は回避されます。

于 2012-06-28T08:45:24.667 に答える