这是我的实施 但是,分析文本文件时有点慢, 任何人都有更好的想法或更好的数据结构来实现随机写作? 我没有使用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;
}
}
答案 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);
}
这里实际创建的唯一字符串是最终作为哈希表中的键的字符串。密钥以简单的字符数组旋转,避免字符串临时。