一、前言
这是本专栏正式第一篇文章
本专栏没有太多的废话
都是干货与知识点
因为各位读者都是有一定基础的
所以有些内容我就直接上结论
如果想更加详细的了解
可以私信或评论
我在慢慢给各位读者细说
二、算法的效率
1、算法的评估
① 空间复杂度
评估执行程序所需要的时间
② 时间复杂度
评估执行程序所需的存储空间
2、大O表示法
算法的复杂度可以从最好情况,平均情况,最坏情况三个角度来用O表示
3、复杂度比较(从低到高)
logn | 根号n | n | nlogn | n^2 | n^3 | n! |
---|
当数量级为前四种时
我们才称为效率高的算法
有的时候也会考虑到需要用空间换时间的方式
来降低时间复杂度
比如python就是一个典型的用空间换时间的编程语言
为什么python的执行效率没有C/C++高(执行效率,不是运行效率)
这里读者可以先思考一下
答案我放在最后
三、上手小题目(最大利益问题)
题目:
外汇交易可以通过兑换不同国家的货币以赚取汇率差。比如1 美元兑换 100 日元 时购入1000 美元,然后等汇率变动到 1 美元兑换 108日元时要卖出。这样就可以赚取(108-100)× 1000=8000日元。
现在请将某货币在t时刻的价格 Rt,(t=0,1,2,…,n-1)作为输人数据,计算出 价格差Rj-Ri(其中j>i)的最大值.
也可以参考下图
输入示例1:
6
5
3
1
3
4
3
输出示例1:
3
输入示例2:
3
4
3
2
输出示例2:
-1
分析:
本题目最重要的是:低买高卖
但是特别需要注意的是示例2是一个价格逐渐降低的情况
所以不论此时怎么购买都是会亏损的(单调递减)
所以此时最大利益为-1
我们需要设置两个值来记录下汇率的最小值(minv)和价格差的最大值(maxv)
不断更新这两个值来得到汇率差最大化
代码:
#include <iostream>
#include <algorithm>
using namespace std;
static const int MAX = 20000;
int main(){
int R[MAX],n; // 数组R用于记录输入的数据
// n用于记录输入的总数
cin >> n;
for(int i=0;i<n;i++) cin >> R[i]; // 时间复杂度:O(n)
int maxv = -20000000; // 汇率差的最大值
// 设置一个足够小的初始值,防止n中的数值或汇率差低于初始值
int minv = R[0]; // 先把数组中第一个数据赋值为汇率最低数值
for(int i=1; i < n ; i++){ // 时间复杂度:O(n)
maxv = max(maxv,R[i] - minv); // 比较已保存的汇率差值大还是最新的汇率差值大
minv = min(minv,R[i]); // 比较已保存的汇率小,还是当前的汇率小
}
cout << maxv << endl;
return 0;
}
四、思考答案
以python对象为例
为了保证python对象的灵活性
会选择牺牲大量的存储空间
比如说python有动态添加属性这个方法(C/C++没有)
python拿到一个对象,可以直接给它动态添加属性
其实动态添加属性的原理很简单:通过字典来实现
我们创建类C并初始化
不断往c里添加进去
可以直接通过以下方式进行添加参数
但是C/C++就不可以这样
这个例子虽然很简单
很好的证明了python用空间换时间
通过增加内存消耗的方式,提高执行效率