0

这是我的实现但是,分析文本文件时有点慢,有人有更好的想法或更好的数据结构来实现随机写入吗?我没有使用 STL 库,所以不用担心语法。而不是使用push_back,这里的vector使用.add

randomInteger 将在范围之间生成随机整数

如果可能的话,我想制作 2000 个字符;

我认为最慢的部分是逐字符读取文件?

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

您需要确定它花费的时间太长。(这段代码如何在普通笔记本电脑上运行不到一秒?)

如果是,您需要配置文件。

例如,一个可能的候选者是生成随机数的成本......

你只会通过分析来反驳我;)

于 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 回答