数据结构与算法参考答案(第七周)
一、已知顺序表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),我们由分析可以很容易地知道递归的终止条件是k为0的时候。然后在k不等于0时,我们返回L.elem[k]+(0到k-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); } }
算法分析:该算法的时间复杂度也是线性的,但是程序运行也开辟了大量空间。利用递归算法实现也会带来额外的空间开销。
二、若矩阵Am×n中的某个元素aij是第i行中的最小值,同时又是第j列的最大值,则称此元素为矩阵中的一个马鞍点。假设以二维数组存储矩阵Am×n,试编写求出矩阵中所有马鞍点的算法,并分析你的算法在最坏情况下的时间复杂度。
答:
我们首先声明两个大小为m与n的int型的数组。它们两个用于存储每一列的最大值和每一行的最大值。通过遍历先讲两个数组确定。然后再遍历的过程中进行比较如果是马鞍点就存入数组中。该算法实现的伪代码如下:
/* 函数名称:获得矩阵中马鞍点 传入参数:二维矩阵数组 返回值:马鞍点结构体数组 */ 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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。