初探matlab——用matlab函数计算代码的时空复杂度

可能我写的题目会让大家感觉多此一举,计算一个简单的时空复杂度为什么要用到函数拟合?其实这样简单的计算不是目的,而是在这个过程中有一种拟合曲线的思维和一种工程的方法


前言

本文由计算一串简单的代码为开始,用函数拟合的方式计算其时空复杂度,注重对过程的学习


一、时空复杂度

通常情况下,数据结构中告诉我们,不同的算法实现方式会有不同的时空复杂度。算法的时空复杂度是对算法的执行时间和空间资源使用的度量。时空复杂度是分析和比较算法效率的重要指标之一。

1.时间复杂度:时间复杂度描述了算法执行所需的时间量级,即算法执行时间随问题规模增长的趋势。常见的时间复杂度有:

O(1):常数时间复杂度,表示算法的执行时间是一个常量,与问题规模无关。
O(log n):对数时间复杂度,表示算法的执行时间随问题规模呈对数增长。
O(n):线性时间复杂度,表示算法的执行时间与问题规模成线性关系。
O(n^2):平方时间复杂度,表示算法的执行时间随问题规模的平方增长。
O(2^n):指数时间复杂度,表示算法的执行时间随问题规模呈指数增长。
等等。

2.空间复杂度:空间复杂度描述了算法在执行过程中所需要的额外存储空间量级,即算法执行过程中所使用的内存空间随问题规模增长的趋势。常见的空间复杂度有:

O(1):常数空间复杂度,表示算法的空间使用是一个常量,与问题规模无关。
O(n):线性空间复杂度,表示算法的空间使用与问题规模成线性关系。
O(n^2):平方空间复杂度,表示算法的空间使用随问题规模的平方增长。
O(2^n):指数空间复杂度,表示算法的空间使用随问题规模呈指数增长。
等等。

在分析算法时,我们通常关注最坏情况下的时间复杂度,因为它给出了算法在最不利的情况下的性能保证。同时,空间复杂度也是一个关键因素,特别是在资源受限的环境下。通过分析时空复杂度,我们可以选择最适合特定问题的算法,并对算法进行改进和优化。

二、计算时空复杂度

这里我简单计算一个时间复杂度,空间复杂度也是同理

1.代码

代码如下(示例):

for (i=1; i<=n; i++)
  if (2*i<=n)
 for (j=2*i; j<=n; j++)
  y=y+i*j;

这是一道让我们计算时间复杂度的题目,有时候我们可以直接看出来其时间复杂度,但是如果当情况变得复杂,我们肉眼无法直接看出,所以可以用到曲线拟合的方式

2.构造点集

上述代码,我们想用穷举法的方式写出其不同 n 值情况下循环的次数,以便直观的看出其不同条件下的执行次数,也为我们后续构造函数提供条件

#include <stdio.h>
int main()
{
	while (1)
	{
		int m = 0, i = 0, n = 0, j = 0;
		printf("n=");
		scanf_s("%d", &n);
		for (i = 1; i <= n; i++)
		{
			if (2 * i <= n)
			{
				for (j = 2 * i; j <= n; j++)
				{
					m++;
				}
			}
		}
		printf("m=%d\n", m);
		printf("\n");
	}
	return 0;
}

我们用 m 来记录内循环的循环次数,再使用一个 while 循环就可以不断地计算不同n 值条件下的循环次数。

3.结果

nm
10
32
56
712
920
1130
1342
1556
1772
1990
21110
23132
25156
27182
29210
31240
33272
35306
37342
39380
41420
43462
45506
47552
49600
51650
53702
55756
57812
59870
61930

我的步长为2,列出如上数据,从1——61

三、导入matlab拟合

1.matlab代码释义

x=1:2:61;
y=[0,2,6,12,20,30,42,56,72,90,110,132,156,182,210,240,272,306,342,380,420,462,506,552,600,650,702,756,812,870,930];
plot(x,y,'*');
hold on;
p=polyfit(x,y,3);
plot(x,polyval(p,x));
hold on;
xlabel('x');
ylabel('y');
grid on;

1.这里的 x=a: b: c 意为从1开始到62以步长为2步进
2.plot是matlab中打印的意思(类似于C中printf),‘*’ 意为每个点都用 * 显示在图像中
3.polyfit是matlab中最小二乘法公式,“3”是最小二乘法次方数

在这里插入图片描述

图片引自:https://zhuanlan.zhihu.com/p/38128785

4.polyval(p, x) 在MATLAB中,polyval(p, x)是用于计算多项式函数在给定自变量 x 处的值的函数调用。

具体含义如下:

p 是一个多项式系数向量,通常是通过 polyfit 函数得到的。
x 是一个标量或向量,表示自变量的值或一组自变量的值。

5.最后我们打印点集和 x, polyval(p,x),这是以 x 为横轴,polyval(p,x)为纵轴的图像

2. 图像展示

在这里插入图片描述

四、计算拟合函数

1.可以看出其函数类型类似于二次函数,我们再画一个二次函数与之拟合

function main
x=1:2:61;
y=[0,2,6,12,20,30,42,56,72,90,110,132,156,182,210,240,272,306,342,380,420,462,506,552,600,650,702,756,812,870,930];

p=polyfit(x,y,3);
plot(x,y,'*',x,polyval(p,x));
hold on;
y=x.^2;
plot(x,y,'r');
hold on;
xlabel('x');
ylabel('y');
title('y=x^2 VS O(n)');
legend('y=O(n)', ' y = x^2');
grid on; 			//绘制网格

这里的高度有些偏差,我们给 y=x^2 乘以不同的倍数缩小观察拟合程度

2.

function main
x=1:2:61;
y=[0,2,6,12,20,30,42,56,72,90,110,132,156,182,210,240,272,306,342,380,420,462,506,552,600,650,702,756,812,870,930];

p=polyfit(x,y,3);
plot(x,y,'*',x,polyval(p,x));
hold on;
y=x.^2;
plot(x,(1/3)*y,'r');					//1/3的倍数
hold on;
xlabel('x');
ylabel('y');
title('y=x^2 VS O(n)');
legend('y=O(n)', ' y = x^2');
grid on;

在这里插入图片描述
不断趋近

3.

function main
x=1:2:61;
y=[0,2,6,12,20,30,42,56,72,90,110,132,156,182,210,240,272,306,342,380,420,462,506,552,600,650,702,756,812,870,930];

p=polyfit(x,y,3);
plot(x,y,'*',x,polyval(p,x));
hold on;
y=x.^2;
plot(x,(1/4)*y,'r');  					//1/4的倍数
hold on;
xlabel('x');
ylabel('y');
title('y=x^2 VS O(n)');
legend('y=O(n)', ' y = x^2');
grid on;

在这里插入图片描述
可以看到完全重合,证明了其复杂度为O(n^2)

总结

由这个方法我们可以拟合这种简单的图像,知其性质。而对于复杂的问题,matlab图像拟合也十分有价值

1.数据分析和建模:函数曲线拟合可以用于分析和建模实验或观测数据。通过拟合数据点,可以找到最佳的函数模型来描述数据的趋势和关系。这对于数据的可视化、趋势预测、数据插值和外推等方面非常有用。

2.参数估计和优化:函数曲线拟合可以用于估计函数模型中的参数。通过拟合数据点,可以得到最优的参数值,从而帮助解决参数估计和优化问题。这在统计建模、机器学习和优化领域中具有广泛的应用。

3.数据平滑和噪声去除:函数曲线拟合可以用于平滑数据并去除数据中的噪声。通过拟合数据点,可以获得平滑的函数曲线,从而减少数据中的噪声影响,并提取出数据的主要趋势和特征。

4.插值和外推:函数曲线拟合可以用于对数据进行插值和外推。通过拟合数据点,可以通过函数模型对缺失或未来的数据进行预测和估计。这对于填补缺失数据、预测趋势和进行预测分析非常有用。

总之,函数曲线拟合在数据分析、建模和优化等领域中扮演着重要的角色,可以帮助我们理解数据的特征和关系,并支持各种应用的实现。MATLAB提供了丰富的函数拟合和数据分析工具,可以方便地进行函数曲线拟合和相关分析。

文献参考阅读:

中 图 分 类 号:TP301文 献 标 识 码:A文 章 编 号:1009-3044(2011)19-4636-03Several
标题: Calculation Methods of Time Complexity

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值