2012-06-28 32 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); 
} 

這裏,實際上是創建的唯一字符串作爲哈希表的關鍵是結束的字符串。密鑰以簡單的字符數組旋轉,避免字符串臨時性。