打印所有可能有 4 个字母的单词的时间太多

Too much time to print all possible words that have 4 letters

本文关键字:单词 时间 太多 可能有 打印      更新时间:2023-10-16

我写了一个程序,可以打印所有可能的单词,这些单词有4个字母,字母可以是大写或小写,花了42分钟,这是很长的时间。

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;`

所以我需要知道程序中大部分时间的时间。以及我如何使其更高效。

我们可以摆脱对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';
                 }
}

在我的机器(相当落后的硬件 - AMD A8-7600(上进行的快速测试显示,这在半秒多一点的时间内运行(输出定向到文件(。实际上,时间可能更多地取决于磁盘速度而不是 CPU 速度。它产生大约 30 兆字节的输出,因此在最大写入速度为 100 兆字节/秒(左右(的典型磁盘上,无论 CPU 速度如何,最短时间约为三分之一秒(尽管您可能能够做得更好使用非常快的 CPU 和 SSD(。

Coffin @Jerry答案(这已经是 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 毫秒。

如果您认为这里的内部循环只是对预分配缓冲区的微不足道的指针操作,没有函数调用、额外的分支和毒害寄存器并浪费时间的"复杂"东西,这一点很明显(operator<<即使对于 char s 来说也是一个相当复杂的野兽 - 如果你问我,没有充分的理由(。IO(加上愚蠢的iostream开销(每~700 KB只执行一次,因此其成本得到了很好的摊销。