初学者对于时间复杂度的直观体会以及对递归调用数数的心得

作为一个初学数据结构和算法的新手小白,经常在各种有关算法的书中看到时间复杂度以及空间复杂度的相关概念,并且还被要求会计算相应算法的时间复杂度,但是,作为一个初学者,虽然有相关的概念,但是在日常学习的算法里很少有能直接体现不同算法产生结果所需要时间的差异,故此这里给出两个今天本人自己遇到的,直观体现算法复杂度的一个简单问题的两个不同算法。

问题:调和级数不等式

对指定的的正数x,y(2<x<y),试求满足下面调和级数不等式的正整数m的取值范围:x<1+1/2+1/3+1/4+1/5+...1/m<y

下面是两种算法的代码,可运行:

#include<iostream>
#include<math.h>
using namespace std;
void TiaoHe()
{
	int x, y,m=1;
	cin >> x; cin >> y;
	double s = 0;
	while (s <= x)
	{
		s = s + 1.0 / m++;
	}
	while (s < y)
	{
		s = s + 1.0 / m++;
	}
	cout << m << endl;
}
void TiaoHe1()//时间复杂度过高,导致短时间内无法出现结果
{
	int x, y;
	cin >> x;
	cin >> y;
	int m = 1;
	double s = 0;
	while (s < x)
	{
		s = 0;
		for (int i = 1.0; i <= m; i++)
		{
			s += 1.0 / i;
			
		}
		m++;
		cout << s<<endl;
	}
	while (s < y)
	{
		s = 0;
		for (int i = 1.0; i <= m; i++)
		{
			s += 1.0 / i;
		}
		m++;
		cout << s << endl;
	}
	cout << m << endl;
}
int main()
{
	TiaoHe1();
	return 0;
}

在上述代码中,TiaoHe()函数中只运用了两个while 循环,而在TiaoHe1()函数里while循环里还嵌套了for循环导致算法的时间复杂度远高于前一个算法,这就导致原本在第一个算法中需要一两秒就可以得出的结果在算法二中需要5分多钟,从这就能直观的展现不同算法的时间复杂度的问题,对未来的学习有一定的帮助

Ps(在今天的学习中还总结了在通过递归调用来数数的时候,通常递归的函数必须在返回语句中也就是return 语句中。

例如在二叉树中求叶子节点的个数:

int BiTreeClass::Countleaf(BiTree *bt)
{
	if (bt == NULL)
		return 0;
	if (bt->lc == NULL&&bt->rc == NULL)
	{
		return 1;
	}
	return(Countleaf(bt->lc) + Countleaf(bt->rc));
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值