可能我写的题目会让大家感觉多此一举,计算一个简单的时空复杂度为什么要用到函数拟合?其实这样简单的计算不是目的,而是在这个过程中有一种拟合曲线的思维和一种工程的方法
文章目录
前言
本文由计算一串简单的代码为开始,用函数拟合的方式计算其时空复杂度,注重对过程的学习
一、时空复杂度
通常情况下,数据结构中告诉我们,不同的算法实现方式会有不同的时空复杂度。算法的时空复杂度是对算法的执行时间和空间资源使用的度量。时空复杂度是分析和比较算法效率的重要指标之一。
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.结果
n | m |
---|---|
1 | 0 |
3 | 2 |
5 | 6 |
7 | 12 |
9 | 20 |
11 | 30 |
13 | 42 |
15 | 56 |
17 | 72 |
19 | 90 |
21 | 110 |
23 | 132 |
25 | 156 |
27 | 182 |
29 | 210 |
31 | 240 |
33 | 272 |
35 | 306 |
37 | 342 |
39 | 380 |
41 | 420 |
43 | 462 |
45 | 506 |
47 | 552 |
49 | 600 |
51 | 650 |
53 | 702 |
55 | 756 |
57 | 812 |
59 | 870 |
61 | 930 |
我的步长为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