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