2012-06-28 41 views
0

这是我的实现 然而,分析文本文件时有点慢, 任何人有更好的主意或更好的数据结构来实现随机写入? 我不使用STL库,所以不用担心语法。 代替这里使用的push_back,载体使用。新增随机写作马尔可夫模型效率

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

我使用macbk Air 2012,因为我得到了一个演示程序,其运行速度比我的快得多。我很好奇为什么演示可以运行得更快。 – timothyboyboy

+0

我在这个函数中放置一个大约1.8MB的文本文件。输出结果大约需要2分钟。 – timothyboyboy

回答

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

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