初识算法中的复杂度(斐波那契(循环结构))

题目描述

斐波那契数列是指这样的数列:数列的第一个和第二个数都为 1,接下来每个数都等于前面 2 个数之和。

给出一个正整数 a,要求斐波那契数列中第 a 个数是多少。

输入格式

第 1 行是测试数据的组数 n,后面跟着 n 行输入。每组测试数据占 1 行,包括一个正整数 a(1≤a≤30)。

输出格式

输出有 n 行,每行输出对应一个输入。输出应是一个正整数,为斐波那契数列中第 a 个数的大小。

输入输出样例

初识算法中的复杂度(斐波那契(循环结构))_第1张图片

以下题解已通过检测:

解法一

(本人做的):

#include 
using namespace std;
int main(){
	int c[30];
	c[0]=1;
	c[1]=1;
	for(int j=2;j<30;j++){
		c[j]=c[j-1]+c[j-2];
	}
	int n;
	cin>>n;
	for(int i=0;i>a;
		cout<

解法二

(摘取洛谷点赞数最多的题解):

#include
using namespace std;
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int a;
		cin>>a;
		int x[30];
		x[1]=x[2]=1;
		for(int i=3;i<=a;i++)
			x[i]=x[i-1]+x[i-2];
		cout<

代码1分析


1. 预处理部分:
   代码首先预计算了前30个斐波那契数,存储在数组 c 中。
   这个预处理的时间复杂度是 O(30),即 O(1),因为30是一个常数。

2. 查询部分:
   对于每个查询,直接输出预计算的结果 c[a-1]。
   每次查询的时间复杂度是 O(1)。
   如果有 n 个查询,总的时间复杂度是 O(n)。

3. 空间复杂度:
   使用了大小为30的数组 c,空间复杂度是 O(1)。

代码2分析


1. 查询部分:
   对于每个查询,代码动态计算斐波那契数列的第 a 项。
   每次计算的时间复杂度是 O(a)。
   如果有 n 个查询,且每个查询的 a 最大为 A,则总的时间复杂度是 O(n · A)。

2. 空间复杂度:
   每次查询时,使用了一个大小为30的数组 x,空间复杂度是 O(1)。

复杂度对比


代码1:预处理 O(1),查询 O(n),总时间复杂度 O(n)。
代码2:查询O(n · A),总时间复杂度 O(n ·A)。

显然,代码1 的效率更高,尤其是在a的范围较小(比如 a <= 30)或者 A 较大的情况下。

以上便是全部内容啦,若有什么错误的、不理解的、有待补充的,欢迎留言噢~共同进步吖~

你可能感兴趣的:(算法(C++)自学笔记,算法)