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

 

一、已知顺序表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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/lightac/p/12832504.html