数据结构实验一 求整数平方和、铺地板和Hanoi塔等问题的求解

1、实验描述

用C语言编程实现求整数平方和、铺地板和Hanoi塔等问题的求解在程序中加入clock ()来计算求解时间使用不同的输入值得到对应的时间分析算法的时间复杂度并与测量结果进行比较如果存在差异,解释原因。

2、实验设计

2.1、 求整数平方和问题

利用迭代来计算从 1 到 n 之间的整数平方和,输入 10 组大小分别为 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 的 n。为了放大函数执行的时间,将函数放入的循环的次数设置为 1,000,000。

2.2、铺地板问题

利用递归的方式来计算长边为 n 的区域一共有多少种铺法。输入 10 组大小分别为 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 的 n。为了放大函数执行的时间,将函数放入的循环的次数设置为 1,000。

2.3、Hanoi塔问题

利用递归的方式来求解移动汉诺塔所需的最少次数。输入大小分别为 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 的 n。为了放大函数执行的时间,将函数放入的循环的次数设置为 1,000。

3、实验实现过程

3.1、求整数平方和问题

3.1.1、思路

  1. 编写函数,其参数为 n ,在测试函数中通过改变传入的 n 的大小来获取不同的实验结果。
  2. 定义 clock_t 类型的变量 start_time 并调用 clock() 函数来记录函数开始执行时间。
  3. 定义求平方和函数 sum(), 将 sum() 函数放入一个循环次数为 1,000,000 的循环中,并执行。
  4. 定义 clock_t 类型的变量 end_time 并调用 clock() 函数来记录函数执行结束时的时间。
  5. 在控制台打印 (double)(end_time - start_time) / CLOCKS_PER_SEC,此即函数执行 1,000,000 次耗费的时间。
  6. 重复 5 次实验,得到平均数据。
  7. 记录相应的 10 组数据,并绘制对应的 Excel 图表。

3.1.2、例程代码

int sum(int n)
{
    int res = 0;
    if (n < 1)
    {
        printf("错误!\n");
        return res;
    }
    for(int i = 1; i <= n; i++)
        res += i * i;
    return res;
}

3.2、铺地板问题

3.2.1、思路

  1. 编写函数,其参数为 n ,在测试函数中通过改变传入的 n 的大小来获取不同的实验结果。
  2. 定义 clock_t 类型的变量 start_time 并调用 clock() 函数来记录函数开始执行时间。
  3. 定义求地板铺法的函数 spread(), 将 spread() 函数放入一个循环次数为 1,000 的循环中,并执行。
  4. 定义 clock_t 类型的变量 end_time 并调用 clock() 函数来记录函数执行结束时的时间。
  5. 在控制台打印 (double)(end_time - start_time) / CLOCKS_PER_SEC,此即函数执行 1,000 次耗费的时间。
  6. 重复 5 次实验,得到平均数据。
  7. 记录相应的 10 组数据,并绘制对应的 Excel 图表。

3.2.2、例程代码

int spread(int n) {
    if (1 == n)
        return 1;
    if (2 == n)
        return 2;
    return spread(n - 1) + spread(n - 2);
}

3.3、Hanoi 问题

3.3.1、思路

  1. 编写函数,其参数为 n ,在测试函数中通过改变传入的 n 的大小来获取不同的实验结果。
  2. 定义 clock_t 类型的变量 start_time 并调用 clock() 函数来记录函数开始执行时间。
  3. 定义求移动 Hanoi 塔所需最少次数的函数 Hanoi(), 将 Hanoi() 函数放入一个循环次数为 1,000 的循环中,并执行。
  4. 定义 clock_t 类型的变量 end_time 并调用 clock() 函数来记录函数执行结束时的时间。
  5. 在控制台打印 (double)(end_time - start_time) / CLOCKS_PER_SEC,此即函数执行 1,000 次耗费的时间。
  6. 重复 5 次实验,得到平均数据。
  7. 记录相应的 10 组数据,并绘制对应的 Excel 图表。

3.3.2、例程代码

void HanoiTower(int n, char source, char temp, char target) {
    if (n < 1)
        return;
    if (1 == n) {
        // printf("%c->%c \n", source, target);
        return;
    }
    HanoiTower(n - 1, source, target, temp);
    // printf("%c->%c \n", source, target);
    HanoiTower(n - 1, temp, source, target);

    return;
}

4、实验结果

4.1、求整数平方和问题数据记录

4.2、铺地板问题数据记录

4.3、汉诺塔问题数据记录

5、实验结论

5.1、算法时间复杂度分析

  • 对于迭代法求整数平方和,其时间复杂度是 \(T(N) = O(N)\)

  • 对于递归求铺地板的方法数,有 \(T(N) = T(N - 1) + T(N - 2) + 2\), 结合 N = 5 时的递归树:

    可知,时间复杂度为 T(N) = \(O(2^h)\) = \(O(2^n)\),其中,h 为树的高度。

  • 对于递归求解 Hanoi 问题,有 \(T(N) = 2T(N - 1) + 1\),由此可得,其时间复杂度为 \(T(N) = O(2^N)\)

5.2、与实验结果进行比较

  • 迭代法求整数平方和问题中,根据实验数据绘制的折线图基本呈直线,即函数运行的时间与输入的 n 的规模成线性关系,与理论分析的 \(T(N) = O(N)\) 基本吻合,但是有略微波动,这种波动可能是与 CPU 的内存分配和运行速度有关。
  • 递归求铺地板的方法数中,对时间取对数最后得到的折线基本呈直线,与理论分析的结果 \(T(N) = O(2^N)\) 基本吻合,但是有轻微波动,造成波动的原因可能是随着递归求解的 n 的增大 ,递归占用的内存也相应增大,因此 CPU 的性能会对结果造成一些小的影响。
  • 递归求解 Hanoi 问题中,对时间取对数最后得到的折线基本呈直线,与时间复杂度分析的 \(T(N) = O(2^N)\) 吻合地较好。
posted @ 2020-10-23 22:35  模糊计算士  阅读(373)  评论(0编辑  收藏  举报