阅读本文前,请确保已经学会C++的基本知识,包括:三大结构(顺序、分支、循环)、数组、字符串等相关知识。
部分题目可能要求掌握相应的基础算法。
一、小灰与大黄的故事
二、怎么衡量代码的好坏
让我们来想象一个场景:某一天,小灰和大黄同时加入了一个公司......
一天过后,小灰和大黄各自交付了代码,两端代码实现的功能都差不多。大黄的代码运行一次要花0.1秒,内存占用5MB。小灰的代码运行一次要花100秒,内存占用500MB。于是......
由此可见, 衡量代码的好坏,包括两个非常重要的指标 :
1.运行时间;
2.占用空间。
三、基本操作执行次数
关于代码的运行时间,我们一般用程序的基本操作执行次数来计算,我们用四个生活中的场景,来做一下比喻:
场景1:
给小灰一条长10寸的面包,小灰每3天吃掉1寸,那么吃掉整个面包需要几天?
答案自然是 3 × 10 = 303×10=30 天。
如果面包的长度是 NN 寸呢?
此时吃掉整个面包,需要 3 × n = 3n3×n=3n 天。
如果用一个 数学函数 来表达这个相对时间,可以记作 T(n)=3nT(n)=3n 。
我们如果用C++程序来实现这个问题,那么代码如下:
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
cout << "第一天,等待" << endl;
cout << "第二天,等待" << endl;
cout << "第三天,吃掉一寸面包" << endl;
}
}
Copy
场景2:
给小灰一条长16寸的面包,小灰每5天吃掉面包剩余长度的一半,第一次吃掉8寸,第二次吃掉4寸,第三次吃掉2寸......那么小灰把面包吃得只剩下1寸,需要多少天呢?
这个问题翻译一下,就是数字16不断地除以2,除几次以后的结果等于1?这里要涉及到数学当中的 对数 ,以2为底,16的对数,可以简写为 log_216log216 ,这个式子算的结果就是4了。我们在计算机中一般简记为 log16log16 。
因此,把面包吃得只剩下1寸,需要 5 × log16 = 5 × 4 = 205×log16=5×4=20 天。
如果面包的长度是 NN 寸呢?
需要 5 × logn = 5logn5×logn=5logn 天,记作 T(n)= 5lognT(n)=5logn 。
代码如下:
int main()
{
int n;
cin >> n;
for(int i = 1; i < n; i = i * 2)
{
cout << "第一天,等待" << endl;
cout << "第二天,等待" << endl;
cout << "第三天,等待" << endl;
cout << "第四天,等待" << endl;
cout << "第五天,