2017-05-24 59 views
0

我寫了一個程序,打印所有可能的單詞有4個字母,字母可以是大寫或小寫,而且花了42分鐘,這是長時間時間「。打印4個字母的所有可能單詞的時間太長

char Something[5]={0,0,0,0}; 

for(int i=65;i<=122;i++){ //65 is ascii representation of A and 122 for z 
    Something[0]=i; 
    cout<<Something<<endl; 
    for(int j=65;j<=122;j++){ 
     Something[1]=j; 
     cout<<Something<<endl; 
     for(int n=65;n<=122;n++){ 
      Something[2]=n; 
      cout<<Something<<endl; 
      for(int m=65;m<=122;m++){ 
       Something[3]=m; 
       cout<<Something<<endl;` 

所以我需要知道程序中大部分時間需要什麼。 而我怎樣才能使它更有效率。

+3

不相關,但只是寫'for(int i ='A'; i <='z'; i ++)。它節省了不必要的評論,更清楚你在做什麼,並以不同的編碼工作 – Tas

+2

你的迭代會導致 - 「長時間的」!!! –

+1

有超過1100萬個字符串*可以打印*。這就是問題所在。控制檯I/O很可能是您的程序花費大部分時間的地方。如果你刪除了所有'cout'語句,程序運行速度會快幾個數量級。考慮把你所有的個人號碼寫入'sstream'。然後,當sstream達到一定的長度(例如1M個字符)時,請執行cout或保存到文件。清除流並保持循環。 – selbie

回答

6

我們可以擺脫電話到endl,只能使用字母和簡單的寫了每個字符串,因爲它是完整的:

#include <string> 
#include <vector> 
#include <iostream> 

int main() { 
    std::string out = " "; 

    std::string letters = "abcdefghijklmnopqrstuvwxyz" 
          "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

    for (char f : letters) 
     for (char g : letters) 
      for (char h : letters) 
       for (char i : letters) { 
        out[0] = f; 
        out[1] = g; 
        out[2] = h; 
        out[3] = i; 
        std::cout << out << '\n'; 
       } 
} 

我的機器上的快速測試(這是相當後緣hardware--一臺AMD A8-7600)顯示這個運行在半秒鐘之內(輸出指向一個文件)。實際上,時間可能取決於磁盤速度而不是CPU速度。它產生大約30兆字節的輸出,所以在最大寫入速度爲每秒100兆字節(典型值)的典型磁盤上,最短時間約爲三分之一秒,而不考慮CPU速度(儘管您可能能夠使用真正快速的CPU和SSD做得更好)。

+1

這比我的嘗試效率高得多。 – nakiya

+3

@nakiya ...和更具可讀性。 –

+0

在每個對應的循環之後而不是全部在內部循環中複製到'out [#]'或者甚至使用直接'out'元素作爲循環變量(它們可能不再是寄存器中的值)內循環中的'operator <<'無論如何都會溢出每個寄存器)。 –

2

Riffing在@Jerry Coffin's answer(這已經是一個巨大的勝利了OP的解決方案),我得到我的機器上一個額外的20倍改進:

#include <string> 
#include <vector> 
#include <iostream> 

int main() { 
    const char l[] = "abcdefghijklmnopqrstuvwxyz" 
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    // trim away the final NUL 
    const char (&letters)[sizeof(l)-1] = (const char (&)[sizeof(l)-1])l; 

    std::vector<char> obuf(5*sizeof(letters)*sizeof(letters)*sizeof(letters)); 

    for (char f : letters) { 
     char *out = obuf.data(); 
     for (char g : letters) { 
      for (char h : letters) { 
       for (char i : letters) { 
        out[0] = f; 
        out[1] = g; 
        out[2] = h; 
        out[3] = i; 
        out[4] = '\n'; 
        out+=5; 
       } 
      } 
     } 
     std::cout.write(obuf.data(), obuf.size()); 
    } 
    return 0; 
} 

重定向到/dev/null編輯:還是要上的文件我磁盤; Linux在IO緩存方面看起來相當不錯)在我的機器上Jerry Coffin的答案大約需要400毫秒,我的時間需要20毫秒。

這是很明顯的,如果你認爲這裏的內環is just trivial pointer manipulation到預先分配的緩存,沒有函數調用,額外的分支機構和「複雜」的東西,毒害寄存器和浪費時間(operator<<是一個相當複雜的野獸甚至char如果你問我,沒有什麼好的理由)。 IO(加上愚蠢的iostream開銷)每700KB只進行一次,所以其成本很好攤銷。

相關問題