c++ - 汉诺塔算法无需在终端窗口打印任何内容

标签 c++ algorithm big-o clock towers-of-hanoi

典型的汉诺塔问题求解器如下:

void hanoi(int diskNumber , int start, int temp, int finish)
{
    if(diskNumber == 1)
    {
        cout<< " Move Disk " << diskNumber<<" from " << start <<" to "<< finish<<endl;
    }
    else
    {
        hanoi(diskNumber-1,start,temp,finish);
        cout<<"Move Disk from " << start <<" to "<<finish<<endl;
        hanoi(diskNumber - 1,temp,start,finish);
    }
}

但我想做的是计算算法运行的时间。因此:

int main
{
    //Hanoi:
    cout<<"Hanoi Tower Problem:"<<endl;
    //3 Disks:
    clock_t htimer3 = clock();
    hanoi(3, 1,2,3);
    cout<<"CPU Time for n = 3 is: "
    <<clock() - htimer3/CLOCKS_PER_SEC<<endl;
    //6 Disks:
    clock_t htimer6 = clock();
    hanoi(6, 1,2,3);
    cout<<"CPU Time for n = 6 is: "
    <<clock() - htimer6/CLOCKS_PER_SEC<<endl;
    //9 Disks:
    clock_t htimer9 = clock();
    hanoi(9, 1,2,3);
    cout<<"CPU Time for n = 9 is: "
    <<clock() - htimer9/CLOCKS_PER_SEC<<endl;
    //12 Disks:
    clock_t htimer12 = clock();
    hanoi(12, 1,2,3);
    cout<<"CPU Time for n = 12 is: "
    <<clock() - htimer12/CLOCKS_PER_SEC<<endl;
    //15 Disks:
    clock_t htimer15 = clock();
    hanoi(15, 1,2,3);
    cout<<"CPU Time for n = 15 is: "
    <<clock() - htimer15/CLOCKS_PER_SEC<<endl;
    //End of Hanoi Tower Problem
    return 0;
}

这里的问题是,例如,如果我设置 diskNumber = 15,代码将运行 32767 次,这将填满终端窗口,我将丢失它之前生成的行(我必须计算其他一些诸如冒泡排序快速排序等算法。稍后我将使用这些数字绘制图表来表示他们的大 O,即:汉诺塔算法的大 O 是 2^n) 。 为了解决这个问题,我修改了代码:

void hanoi(int diskSize, int start, int finish, int temp)
{
  if(diskSize == 1)
    {
        return;
    }
    else
    {
        hanoi(diskSize - 1, start, temp, finish);
        hanoi(diskSize - 1, temp, finish, start);
    }
}

我的主要问题:修改后的代码是否与原始算法的运行时间相同?如果不是,应该怎么办?有什么建议么?

最佳答案

是的,您修改后的代码的时间复杂度与之前的代码相同,因为 cout 需要常数时间。因此,考虑到您正在写入的流,您的运行时间不会受到太大影响(粒度将以纳秒为单位)。

我建议将输出重定向到一个文件。 例如:

./executable > FileName

关于c++ - 汉诺塔算法无需在终端窗口打印任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27019502/

相关文章:

c++ - 这个 "CRT not initialized"错误是怎么回事?

c++ - 为什么设置迭代器指针会导致段错误?

algorithm - 通过位掩码进行二进制搜索?

algorithm - 复杂度为 O(1)、O(n log n) 和 O(log n) 的算法示例

algorithm - 给定一个数组,判断是否有2个数的差为c

c++ - Qt(c++) 中的简单网络超时

c++ - 线程完成后删除Qt Thread中的对象

algorithm - 算法的递归方程

algorithm - 选择带分隔符的数字序列中第 i 个最小数的最佳方法

algorithm - 在小于 O(n) 的比较中找到 3 个最小元素的时间复杂度