Algorithm 随机写马尔可夫模型效率

Algorithm 随机写马尔可夫模型效率,algorithm,data-structures,Algorithm,Data Structures,这是我的实现 但是,在分析文本文件时有点慢, 有谁有更好的想法或更好的数据结构来实现随机写入? 我不使用STL库,所以不要担心语法。 这里的vector不是使用push_back,而是使用.add randomInteger将在范围之间生成随机整数 如果可能的话,我想制作2000个字符 我认为最慢的部分是逐字符读取文件 void generateText(int order, string initSeed, string filename){ Map<string , Vecto

这是我的实现 但是,在分析文本文件时有点慢, 有谁有更好的想法或更好的数据结构来实现随机写入? 我不使用STL库,所以不要担心语法。 这里的vector不是使用push_back,而是使用.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;
    }
}
void generateText(int顺序、字符串initSeed、字符串文件名){
地图模型;
char ch;
字符串键;
ifstream输入(filename.c_str());
for(int i=0;icout您需要确定它花费的时间太长。(这个代码如何在普通笔记本电脑上运行不到一秒钟?)

如果是,您需要配置文件

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


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

我认为它有点慢,因为它在分析阶段创建了很多临时字符串

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
}
for(int i=0;i
你可以这样做:

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);
}
char-key[order+1];//伪代码无效,因为顺序不是常量
键[顺序]=0;/*NUL终止*/
for(int i=0;i

这里实际创建的唯一字符串是在哈希表中作为键的字符串。该键在一个简单的字符数组中旋转,避免了字符串的临时性。

我使用macbk Air 2012,因为我得到了一个比我的运行速度快得多的演示程序。我很好奇为什么演示可以运行得更快。我将一个文本文件放在此函数为1.8MB。输出结果大约需要2分钟。