打印所有可能有 4 个字母的单词的时间太多
Too much time to print all possible words that have 4 letters
我写了一个程序,可以打印所有可能的单词,这些单词有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只执行一次,因此其成本得到了很好的摊销。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 文本文件中的单词链表
- 从持续时间构造std::chrono::system_clock::time_point
- 在指针的帮助下,文本文件中单词的频率
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 从文本文件中读取时钟时间和事件时间并进行处理
- 具有未知值时的时间复杂性
- 如何减少花费的时间
- 打印所有可能有 4 个字母的单词的时间太多
- 如何使用二叉搜索计算搜索单词所需的时间
- 从长时间中提取每个单词的钻头操作
- 如何读取特定单词的字符串并计算发现的时间
- 这个算法获取所有单词梯的时间复杂度是多少?
- 对字符串链表中特定单词的出现次数进行计数.如何在log(n)时间内完成