算法与数据结构(二)————入门问题(最大利益问题)

一、前言

这是本专栏正式第一篇文章

本专栏没有太多的废话

都是干货与知识点

因为各位读者都是有一定基础的

所以有些内容我就直接上结论

如果想更加详细的了解

可以私信或评论

我在慢慢给各位读者细说

二、算法的效率

1、算法的评估

① 空间复杂度

评估执行程序所需要的时间

② 时间复杂度

评估执行程序所需的存储空间

2、大O表示法

算法的复杂度可以从最好情况平均情况最坏情况三个角度来用O表示

3、复杂度比较(从低到高)

logn根号nnnlognn^2n^3n!

当数量级为前四种时

我们才称为效率高的算法

有的时候也会考虑到需要用空间换时间的方式

来降低时间复杂度

比如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)的最大值.

也可以参考下图

在这里插入图片描述

输入示例16
5
3
1
3
4
3

输出示例13
输入示例23
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用空间换时间

通过增加内存消耗的方式,提高执行效率

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值