• 数据结构与算法参考答案(第七周)


     

    一、已知顺序表L含有n个整数,试分别以函数形式写出下列运算的递归算法。(1)求表中的最大整数(2)求表中n个函数之和。

    答:

    通过分析题目,我们很容易知道我们首先需要找到递归的终止条件。然后通过调用递归函数进行查找。

    对于问题(1)来说递归的终止条件便是k等于L.length-1的时候,此时我们已经完成了对顺表的遍历。该算法实现的伪代码如下:

    /*
        函数名称:获得顺序表中元素最大值
        传入参数:顺序表L,初始参数值k
        返回值:顺序表中的元素最大值
    */
    int getSqListMax(SqList &L, int k) {
        if(k == L.length - 1) {
            return L.elem[k];
        }
        else {
            /*如果k对应元素大于k+1到最后元素的最大值就返回k对应的元素值,否则返回后者*/
            return L.elem[k] > getSqListMax(L, k + 1) ? L.elem[k] : getSqListMax(L, k + 1);
        }
    }
    

    算法分析:该算法的时间复杂度是线性的,但是程序运行开辟了大量空间。利用递归算法实现会带来额外的空间开销。

    对于问题(2),我们由分析可以很容易地知道递归的终止条件是k0的时候。然后在k不等于0时,我们返回L.elem[k]+0k-1对应元素的和)即为前k个元素之和。该算法实现的伪代码如下:

    /*
        函数名称:获得顺序表中元素的和
        传入参数:顺序表L,初始参数值k
        返回值:顺序表中的元素的和
    */
    int getSqListSum(SqList &L, int k) {
        if(k == 0) {
            return L.elem[0];
        }
        else {
            return L.elem[k] + getSqListSum(L, k - 1);
        }
    }
    

    算法分析:该算法的时间复杂度也是线性的,但是程序运行也开辟了大量空间。利用递归算法实现也会带来额外的空间开销。

    二、若矩阵An中的某个元素aij是第i行中的最小值,同时又是第j列的最大值,则称此元素为矩阵中的一个马鞍点。假设以二维数组存储矩阵Am×n,试编写求出矩阵中所有马鞍点的算法,并分析你的算法在最坏情况下的时间复杂度。

    答:

    我们首先声明两个大小为mnint型的数组。它们两个用于存储每一列的最大值和每一行的最大值。通过遍历先讲两个数组确定。然后再遍历的过程中进行比较如果是马鞍点就存入数组中。该算法实现的伪代码如下:

    /*
        函数名称:获得矩阵中马鞍点
        传入参数:二维矩阵数组
        返回值:马鞍点结构体数组
    */
    typedef struct
    {
        int x;
        int y;
    }Point;
    Point *getSaddlePoint(int *det[n]) {
        Point ans[n];
        int minx[m];
        int maxy[n];
        //获得每一行的最小值
        for(int i = 0; i < m; ++i) {
            int temp = -1;
            for(int j = 0; j < n; ++j) {
                temp = min(temp, det[i][j]);
            }
            minx[i] = temp;
        }
        //获得每一列的最大值
        for(int i = 0; i < n; ++i) {
            int temp = -1;
            for(int j = 0; j < m; ++j) {
                temp = max(temp, det[i][j]);
            }
            maxy[i] = temp;
        }
        //获得马鞍点
        int k = 0;
        for(int i = 0; i < n; ++i) {
            for(int j = 0; j < m; ++j) {
                if(det[i][j] == minx[i] && det[i][j] == maxy) {
                    ans[k].x = i;
                    ans[k].y = j;
                    k++;
                }
            }
        }
        return ans; //返回马鞍点构成的结构体数组
    }
    

     算法分析:该算法在最差的情况下的时间复杂度为O(n2)。因为在算法实现中使用了二重循环,产生了平方的的时间复杂度。

    作者:LightAc
    出处:https://www.cnblogs.com/lightac/
    联系:
    Email: dzz@stu.ouc.edu.cn
    QQ: 1171613053
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    你最该知道的事(职场)
    C++ OTL MySQL(Windows/Linux) V8.1
    mysql字符串替换
    NYOJ 17 单调递增最长子序列
    IOS Sqlite用户界面增删改查案例
    时间戳工具类
    2014年7月10日,我人生的最重要Upgrade
    Java线程演示样例
    hiho模拟面试题2 补提交卡 (贪心,枚举)
    Android.mk添加本地程序和库的经常使用模版
  • 原文地址:https://www.cnblogs.com/lightac/p/12832504.html
Copyright © 2020-2023  润新知