随机写马尔可夫模型效率

时间:2012-06-28 07:40:11

标签: algorithm data-structures

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

randomInteger将生成范​​围之间的randome整数

如果可能,我想生产2000个字符;

我认为最慢的部分是通过char读取文件char?

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;
    }
}

2 个答案:

答案 0 :(得分:1)

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

如果是,您需要进行个人资料。

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

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

答案 1 :(得分: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);
}

这里实际创建的唯一字符串是最终作为哈希表中的键的字符串。密钥以简单的字符数组旋转,避免字符串临时。