多线程编程和并行计算的实例:期货交易及打车软件算法

news2024/10/7 4:29:07

多线程编程和并行计算的实例:期货交易及打车软件算法

在这里插入图片描述

解决现实生活中的问题时,多处理器和多核系统的普及使并行计算成为一个关键的性能提升手段。在这篇博客中,我们将通过深入讨论两个引人入胜而又具有实际意义的场景——期货交易和打车匹配算法,来展示并行计算如何在实际问题中为我们带来显著优势。

期货交易与多线程编程

期货交易概念:期货交易是一种金融交易,涉及到双方通过交易所买卖未来交付的资产或者现金结算的合约。期货合约是一种标准化合约,规定了一定数量和品质的资产在未来某一时间以约定价格交付。交易的对象可以是各种商品(如农产品、矿产、石油)或者金融工具(如货币、债券、指数)。期货合约为交易双方提供了降低价格波动风险的机会,也允许投资者获得潜在的投机收益。

期货交易与股票交易的对比

  1. 交易对象不同:期货交易涉及各种商品和金融工具,而股票交易是买卖公司的股份。
  2. 杠杆效应:期货交易通常具有杠杆效应,只需要支付一部分的保证金就能参与交易。而股票交易一般要求全额支付交易金额(或使用保证金交易)。
  3. 合约到期:期货合约具有固定的到期日期,在该日期之前做出履行或平仓操作。股票交易没有固定到期,可无限期持有股票。
  4. 交易方向:期货交易允许投资者通过做空合约来盈利,预测价格下跌。而股票交易主要是做多策略,涨价时获利。
  5. 交易手续费:期货交易手续费通常较低,因为合约是标准化的,交易相对简单。股票交易费用可能较高,包括交易佣金、印花税等。
  6. 风险管理:期货交易通过保证金和日终结算制度,可以更好地管理风险。股票交易的风险控制依赖于投资者自身的风险管理能力。

总之,期货交易和股票交易在交易对象、杠杆效应、合约到期、交易方向、手续费和风险管理等方面具有显著差异。投资者根据自身经验、风险承受能力和投资目标来选择合适的交易市场。

期货交易的流程和盈利方式:假设我们有一个玉米农场主(卖方)和一个玉米加工厂主(买方)进行期货交易。玉米农场主预计将在 6 6 6个月后收获 10 , 000 10,000 10,000磅玉米。为了保证价格波动风险,双方决定进行期货交易。

  1. 确定期货合约:
    双方通过交易所来创建一个期货合约,该合约规定以固定价格(如每磅2美元)在6个月后交付10,000磅玉米。农场主持有合约的空头(卖空)仓位,而加工厂主持有合约的多头(买多)仓位。

  2. 期货交易流程:
    期货交易需要支付保证金,这是参与交易所需的最低金额。假设保证金率为10%,则双方分别需支付 10 , 000 10,000 10,000 × 2 \times 2 ×2美元 × 10 % = 2 , 000 \times 10\% = 2,000 ×10%=2,000 美元。此外,每天会进行盯市结算,即按照市场价对未平仓合约的盈亏进行结算。

  3. 盈利方式与可能的盈亏情况:
    a) 假设6个月后,玉米市场价格上涨至每磅 2.5 2.5 2.5美元。加工厂主在期货市场买入 10 , 000 10,000 10,000磅玉米的价格为每磅 2 2 2美元,而在现货市场中,同样数量的玉米的价格为每磅 2.5 2.5 2.5美元。因此,加工厂主通过期货合约节省了 0.5 0.5 0.5美元/磅,获得了 5 , 000 5,000 5,000美元的收益。这种情况下,农场主虽然未能从高价格中获益,但仍能锁定收入,规避价格波动风险。

b) 假设 6 6 6个月后,玉米市场价格下跌至每磅 1.5 1.5 1.5美元。农场主在期货市场以每磅 2 2 2美元的价格卖出,而在现货市场中,同样数量的玉米价格仅为每磅 1.5 1.5 1.5美元。因此,农场主通过期货合约避免了 0.5 0.5 0.5美元/磅的损失,获得了 5 , 000 5,000 5,000美元的收益。而加工厂主未能从低价中获益,但保证了稳定的现货价格。

可能的意外情况
a) 在交易过程中,如果期货价格波动较大,可能导致保证金不足。交易所可能会调高保证金要求或发出追加保证金通知。
b) 交易所可能根据市场需求或政策调整改变期货合约规格。
c) 如果合约持有者没有在到期前平仓,交货程序可能会根据交易所的规定进行。对于不希望实际交付或接收货物的投资者来说,务必在到期前将仓位平仓。
d) 缺乏市场监管和合规性可能导致操纵市场、内幕交易等问题。

通过以上示例,我们可以看到期货交易可以帮助投资者规避价格风险,投机者则可以从预测价格波动中获得盈利。然而,交易中可能遇到意外情况,因此参与者需要对交易规则及市场风险有足够的了解。

为什么期货无论价格涨跌都可以盈利

以金期货为例。假设投资者A预测金价将上涨,他选择做多1份金期货合约。在购买期货合约时,只需支付初始保证金,假设为1000美元。

  1. 价格上涨情况:
    假设金价从每盎司1500美元上涨到1600美元,每盎司涨幅为100美元。A的做多仓位获得了盈利。投资者A可以平仓卖出合约,获得100美元的收益(不考虑手续费等成本)。

  2. 价格下跌情况:
    此时,投资者B预测金价将下跌,他选择做空1份金期货合约。与做多相反,做空期货是以出售合约为手段,押注价格将下跌。

假设金价从每盎司1500美元下跌到1400美元,每盎司跌幅为100美元。B的做空仓位获得了盈利。投资者B可以平仓买回合约来锁定收益,获得100美元的收益(同样不考虑手续费等成本)。

这个示例表明,在期货市场中,投资者可以通过做多(先低买后高卖)或做空(先高卖后低买)期货合约来实现盈利,无论期货价格是上涨还是下跌。而在股票市场中,投资者通常获得收益的方式是购买股票并等待股价上涨(即做多)。虽然有些地区的股票市场也可以通过卖空策略来盈利,但这在很多市场中是受限制的。相比之下,期货市场在交易策略和盈利方式上提供了更大的灵活性。

多线程编程的概念和背景

多线程编程概念简介:多线程编程是一个编程范式,它的核心思想是将一个程序的执行拆分为多个可以同时运行的线程。在单核处理器系统中,多个线程在逻辑上同时运行,而在多核处理器系统中,多个线程可以物理上同时运行。多线程编程允许程序更有效地使用计算机资源,特别是对于现代多核处理器,提高了程序的响应性和性能。

多线程编程应用于各种场景,例如:

  1. 提高程序性能:在数据处理、科学计算、服务器处理请求等方面,多线程可以并行处理任务,提高程序吞吐量。
  2. 提高响应性:在用户界面(UI)程序中,一个线程可以用来显示、用户交互,另一个线程执行计算任务,避免界面冻结。
  3. 资源共享:多线程可以让多个任务共享相同的资源,如数据库连接、文件操作等。
  4. 模拟现实世界:物理计算、游戏等领域,多线程可模拟现实世界多个并发事件。

如何在C++中使用多线程编程:从C++11开始,C++标准库提供了多线程支持,如<thread><mutex><condition_variable><atomic>等。以下是一个简述如何在C++中使用多线程编程的步骤:

  1. 包含必要的头文件,例如<thread><mutex>
  2. 定义线程函数或使用lamda表达式,包含线程要执行的任务。
  3. 创建线程对象,传递线程函数和任何其它必要参数(若有)。
  4. 为保护共享资源,使用互斥量(std::mutex)、原子操作(std::atomic)等,确保数据的一致性和正确性。
  5. 使用条件变量(std::condition_variable) ,处理线程间的通知与等待。
  6. 在完成任务后,调用线程对象的join()方法,以等待线程执行结束。
  7. 在复杂情况下,可以使用更高级别的同步如信号量、屏障等。

需要注意的是,在C++中编写多线程程序时,需要了解并发编程常见的问题,如死锁、竞态条件、资源竞争等,以避免潜在的问题。

模拟交易过程的程序

该C++程序用于模拟期货交易中不同品种商品的价格时序变动和10个交易者的交易行为,同时使用多线程模拟交易者行为。在以下代码中,我们使用C++11的 <thread><mutex> 构建了一个基本的多线程程序。请注意,需要使用C++11或更高版本的编译器才能正确运行此代码。本例中的多线程仅用于模拟目的,并未实现完全的并发控制。在实际项目中,可能需要深入研究并发和同步以保证数据一致性和正确性。本程序中的交易者会随机的更改商品价格,买入或卖出商品。

#include <iostream>
#include <vector>
#include <random>
#include <ctime>
#include <fstream>
#include <thread>
#include <mutex>

using namespace std;
// g++ future_market.cpp -o exe "-std=c++11"

std::mutex mtx; // 线程之间共享的互斥

// 商品类别
class Commodity {
public:
    std::string name;
    double price;

    Commodity(const std::string& name, double initial_price)
        : name(name), price(initial_price) {}
};

// 交易者类别
class Trader {
public:
    std::string name;

    // 买入和卖出方法
    void buy(const Commodity& commodity, double price, double QUANT) const
    {
        std::lock_guard<std::mutex> lock(mtx);
        std::cout << name << " \033[32m买入\033[0m " << QUANT << " 手 " << commodity.name << " \033[1m以价格 " << price << std::endl;
    }

    void sell(const Commodity& commodity, double price, double QUANT) const
    {
        std::lock_guard<std::mutex> lock(mtx);
        std::cout << name << " \033[32m卖出\033[0m " << QUANT << " 手 " << commodity.name << " \033[1m以价格 " << price << std::endl;
    }

    Trader(const std::string& name) : name(name) {}
};

void store_price_history(const std::vector<Commodity>& commodities, int time) {
    std::ofstream history("price_history.txt", std::ios::app);
    history << "Time: " << time << std::endl;
    for (const auto& commodity : commodities) {
        history << commodity.name << " price: " << commodity.price << std::endl;
    }
    history.close();
}

void trader_action(const Trader& trader, std::vector<Commodity>& commodities) {
    std::default_random_engine RAND_ENG(std::time(0));
    std::uniform_int_distribution<int> COMMODITY_DIST(0, commodities.size() - 1);
    std::uniform_real_distribution<double> PRICE_VAR(-1.0, 1.0);
    std::uniform_real_distribution<double> QUANT_DIST(1.0, 10.0);
    std::bernoulli_distribution action_distr(0.5);

    
    for (int TIME = 0; TIME < 100; ++TIME) {
        int RAND_INDEX = COMMODITY_DIST(RAND_ENG);
        double QUANT = QUANT_DIST(RAND_ENG);
        commodities[RAND_INDEX].price += PRICE_VAR(RAND_ENG);
        store_price_history(commodities, TIME);
        
        std::cout<<" ------ 时间:第 "<<TIME/25+1<<" 周 星期 "<<(TIME/5)%5+1<<" 第 "<<TIME%5+1<<" 个交易时 ------ "<<std::endl;
        if (QUANT_DIST(RAND_ENG)>7.0 || QUANT_DIST(RAND_ENG)<3.0) {cout<<" 无 交 易 "<<endl;continue;}
        if (action_distr(RAND_ENG)) {
            trader.buy(commodities[RAND_INDEX], commodities[RAND_INDEX].price, QUANT);
        } else {
            trader.sell(commodities[RAND_INDEX], commodities[RAND_INDEX].price, QUANT);
        }
    }
}


int main() {
    cout<<" ================ 期 货 模 拟 交 易 程 序 ================= "<<endl;
    std::vector<Trader> traders = {{"李想"},{"王潮"},{"刘畅"},{"陈鱼"},{"吴恙"},{"徐愿"},{"胡岚"},{"朱梦"},{"林溪"},{"何华"}};
    std::vector<Commodity> commodities = {{"大豆", 900.0},{"玉米", 500.0},{"金属镍", 1200.0},{"金属铜", 6300.0},{"金属银", 9995.0},{"棕榈油", 1800.0}};

    std::vector<std::thread> threads;
    for (const auto& trader : traders) {
        threads.push_back(std::thread(trader_action, std::ref(trader), std::ref(commodities)));
    }

    for (auto& t : threads) {
        t.join();
    }

    return 0;
}

运行结果:
在这里插入图片描述

打车软件的匹配算法与并行计算

并行计算的概念和背景

并行计算概念:并行计算是指在多处理器或多核系统上同时进行多个相互独立的计算任务,以加速整体程序执行速度。这个方法可以提高计算机系统的性能,加快问题解决的速度,并使得大规模、复杂的问题得以解决。

应用背景:并行计算在许多领域具有较高的实用价值,例如科学计算、图像处理、人工智能、数据挖掘、金融交易等。随着多核处理器技术的发展和市场普及,越来越多的业务需求可以通过并行计算来实现性能和效率的提升。

C++中使用并行计算:C++本身不提供直接的并行计算支持,但可以通过以下几种方式进行并行计算:

  1. OpenMP:OpenMP(Open Multi-Processing)是一个基于C、C++和Fortran语言的并行编程框架,支持共享内存多核处理器的并行计算。使用OpenMP,可以借助编译器提供的指令和运行时库来为已存在的代码添加并行计算功能。例如,在C++中,可能使用以下代码创建一个并行for循环:
#pragma omp parallel for
for (int i = 0; i < n; i++) {
    // 并行执行的代码
}
  1. C++11线程库:C++11引入了新的线程库,允许程序员使用线程、互斥量、条件变量等组件来实现并行性。这个库提供了对原始线程库如POSIX线程和Windows线程的高级抽象,使得在C++程序中实现并行计算更为简便。例如:
#include <thread>

void my_function() {
    // 你希望并行执行的代码
}

int main() {
    std::thread t1(my_function);
    std::thread t2(my_function);
    t1.join();
    t2.join();
    return 0;
}
  1. C++17中的并行算法库:C++17标准加入了支持并行执行的算法库,如std::sort等。借由执行策略,可以方便地将常用算法调整为并行版本。例如:
#include <algorithm>
#include <vector>
#include <execution>

int main() {
    std::vector<int> data = { /* 一些数据 */ };
    std::sort(std::execution::par, data.begin(), data.end());
    return 0;
}
  1. 第三方库:还有一些专门用于C++的并行计算库,如Intel线程构建块(TBB)、Boost.Asio和CUDA等。这些库根据不同需求,提供了各种并行计算方法,使并行计算更为高效。
模拟打车匹配过程的程序

m m m个乘客呼叫出租车,附近的出租车一共有 n n n辆,出租车类和乘客类都带有整数坐标属性,并且优先匹配距离乘客更近的出租车给乘客;

#include <iostream>
#include <vector>
#include <cmath>
#include <mutex>
#include <limits>

class Coordinate {
public:
    int x, y;

    Coordinate(int x, int y) : x(x), y(y) {}
};

double distance(const Coordinate& a, const Coordinate& b) {
    return std::sqrt(std::pow(a.x - b.x, 2) + std::pow(a.y - b.y, 2));
}

void assign_taxi(int i, const std::vector<Coordinate>& passengers,
                 const std::vector<int>& taxi_status, const std::vector<Coordinate>& taxis,
                 std::vector<int>& assigned_taxi) {
    int closest_taxi = -1;
    double min_distance = std::numeric_limits<double>::max();
    for (int j = 0; j < int(taxis.size()); ++j) {
        if (taxi_status[j] == 0) {
            double curr_distance = distance(passengers[i], taxis[j]);
            if (curr_distance < min_distance) {
                min_distance = curr_distance;
                closest_taxi = j;
            }
        }
    }
    if (closest_taxi != -1) {
        assigned_taxi[i] = closest_taxi;
    }
}

int main() {
    // 初始化乘客和出租车状态;
    std::vector<Coordinate> passengers = {{0,0},{1,9},{2,7},{8,1}};
    std::vector<Coordinate> taxis = {{1,1},{5,5},{7,7}};

    int m = int(passengers.size());
    int n = int(taxis.size());

    std::vector<int> assigned_taxi(m, -1);
    std::vector<int> taxi_status(n, 0); // 0 表示空闲,1 表示已被匹配
    std::mutex mtx;

    // 并行匹配过程;
    #pragma omp parallel for
    for (int i = 0; i < m; ++i) {
        assign_taxi(i, passengers, taxi_status, taxis, assigned_taxi);

        if (assigned_taxi[i] != -1) {
            mtx.lock();
            if (taxi_status[assigned_taxi[i]] == 0) {
                taxi_status[assigned_taxi[i]] = 1;
            } else {
                assigned_taxi[i] = -1;
            }
            mtx.unlock();
        }
    }

    // 输出匹配结果;
    for (int i = 0; i < m; ++i) {
        if (assigned_taxi[i] != -1) {
            std::cout << "\033[32m乘客\033[0m " << i << " 已匹配至 \033[32m出租车\033[0m " << assigned_taxi[i] << std::endl;
        } else {
            std::cout << "未找到匹配的出租车给乘客 " << i << std::endl;
        }
    }

    return 0;
}

注意代码里的这些内容:

  1. 变量 std::vector<int> taxi_status(n, 0),其中 0 表示出租车空闲,1 表示出租车已被匹配。

  2. 将出租车分配逻辑单独封装到了 assign_taxi 函数,来方便重复调用。

  3. 使用了互斥锁 std::mutex mtx 来保护 taxi_status。当尝试分配车辆时,会首先检查之前的状态。如果出租车是空闲的,则将其状态设置为已被匹配,同时更新匹配列表。

注意本代码使用贪心算法,可能并不是全局最优解,如果考虑全局最优,需要引入其他的算法。

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS圆角进化论

CSS圆角发展过程 大致经历了3个阶段&#xff0c;包括&#xff1a; 背景图片实现圆角CSS2.0标签模拟圆角CSS3.0圆角属性&#xff08;border-radius属性)实现圆角 ☛背景图片实现圆角&#xff1a;使用背景图片实现圆角的方式很多&#xff0c;实现的方式和圆角的切图方式关系密…

AI绘图软件分享:Midjourney 基础教程(三)

大家好&#xff0c;我是权知星球&#xff0c;今天继续给大家分享Midjourney 基础教程&#xff08;三&#xff09;&#xff1a;Midjourney 图生图。 刚开始学习使⽤ AI 绘画时&#xff0c;⼤部分⼈的绘画⽅式&#xff1a; 有⼀个想象中的画⾯&#xff0c;⽤中⽂将这个画⾯描述…

【文件操作与IO】Java中如何操作文件

目录 Java 中操作文件 File 概述 属性 构造方法 方法 代码示例 文件内容的读写 —— 数据流 InputStream 概述 FileInputStream 概述 利用 Scanner 进行字符读取 OutputStream 概述 利用 OutputStreamWriter 进行字符写入 利用 PrintWriter 找到我们熟悉的方法 代码…

D. A Wide, Wide Graph(树的直径)

Problem - 1805D - Codeforces 给定一棵包含n个节点的树&#xff08;一个无环联通图&#xff09;&#xff0c;对于一个固定的整数k&#xff0c;定义Gk为一个具有n个节点的无向图&#xff0c;其中只有当在给定树中节点u和v之间的距离至少为k时才存在边。 对于从1到n的每个k&…

undefined reference to `tputs‘

昨天在Debian11 上编译 bluez 的时候&#xff0c;看这里&#xff0c;出现了如下这个错误&#xff0c;一般这种未定义的错误提示都是没有链接正确的库导致&#xff0c;但是搞了很久都没解决。 奇怪的是之前在 Centos 上编译却没有遇到这个问题&#xff0c;而且在 configure 时也…

做Java开发,真的“穷途末路”了吗?浅谈从2018-2023年,这行到底“卷”成了啥样

文章目录 一、火爆的行业1、裁员潮引发的行业惶恐2、国情下的行业现状3、时代的快速发展 二、Java开发“卷”成了啥样1、2013年2、2018年3、2013年4、真的需要这么多知识吗 三、大龄程序员何去何从引用来处 一、火爆的行业 “程序员”这个代名词&#xff0c;似乎总是跟“高薪”…

基于多进程并发-进程通讯之管道(pipe)

一、管道&#xff08;pipe&#xff09; 所谓的管道&#xff0c;就是内核⾥⾯的⼀串缓存&#xff08;Pipe&#xff09;。一个进程从管道的⼀端写⼊的数据&#xff0c;实际上是缓存在内核中的&#xff0c;另⼀端读取&#xff0c;也就是从内核中读取这段数据。 特性&#xff1a;…

windwos2016 由于没有远程桌面授权服务器可以提供许可证

一、问题&#xff1a; 经常会遇到&#xff0c;server2016、server2012、server2008操作系统&#xff0c;安装远程桌面服务之后没有激活&#xff0c;经过120天到期之后&#xff0c;没办法再使用&#xff0c;重新安装激活远程桌面服务也不能用。 二、具体的报错如下图&#xff…

归并排序详解-附Python代码

排序思路 将输入的列表递归分解成若干个有序的子列表&#xff08;只含有一个元素&#xff09;&#xff1b;将分解后的有序子列表两两归并成一个新的有序列表&#xff1b;重复步骤2&#xff0c;直到完成排序。 重点&#xff1a;如何定义一个归并函数&#xff0c;可以将两个有序…

Qt-自定义控件

Qt-自定义控件 简单使用 首先创建一个工程 在现有的工程上添加文件&#xff0c;选择Qt设计师界面类 选择Widget 添加两个控件之后&#xff0c;选择水平布局 将刚刚自定义的控件smallWidget放置在原始的控件中 首先在原始工程的ui界面 随便放置一个widget 选择&#xff…

我的内网渗透-代理转发(1)

概念 网关 必须经过 用来进行路由转发的设备&#xff0c;网关的作用是让不同网段之间能够通信 代理 委托访问 无论代理后面挂了几台设备&#xff0c;都认为是从代理进行访问&#xff0c;对外只表现为代理一台。外部认为是与代理进行…

计算机提示xinput1_3.dll丢失,三个详细修复方法

打开《绝地求生》游戏的时候&#xff0c;计算机提示xinput1_3.dll丢失&#xff0c;无法启动运行。重新安装一遍游戏依然无法启动运行。这个是由于xinput1_3.dll文件是属于电脑系统DirectX9.0的一个组件&#xff0c;用于提供输入和输出功能。它包含了各种接口和函数&#xff0c;…

spi控制器和spi设备的加载过程

spi控制器都是挂在platform总线上的&#xff0c;所以要等platform总线上的设备驱动加载spi控制器完成后才能加载spi设备。 1.spi控制器加载 由spi控制器驱动程序调用spi_register_master来完成spi控制器驱动加载 int spi_register_master(struct spi_master *master) { ... s…

【ubuntu20.04上构建qemu启动linux kernel】

参考Ubuntu环境下使用qemu搭建arm64运行环境 - 简书 一、交叉编译工具 sudo apt install gcc-aarch64-linux-gnu aarch64-linux-gnu-gcc -v 二、linux内核编译 git clone https://github.com/torvalds/linux.git cp arch/arm64/configs/virt.config .config make ARCHarm64 m…

并网逆变器杂记1-VO-DCC双环控制

NOTE1&#xff1a; 母线电压恒定的条件是&#xff1a; PV输出功率 &#xff0c;等于逆变侧消耗功率 假设&#xff1a;PV侧给母线输入10A &#xff0c;但是逆变侧消耗1A&#xff0c;此时母线Udc会升高 反之PV输入1A&#xff0c;消耗10A&#xff0c;母线Udc会降低。 NOTE2&#…

【IP地址】使用这个免费工具轻松获取地理位置

文章目录 前言一、Ip-API二、使用示例2.1、语言2.2、数据格式 三、简单示例四、更好的服务五、需要注意的点结尾 前言 今天分享一个免费的在线工具来查询IP地址所在的地理位置。可以通过IP地址所属的网络运营商和其他相关信息来确定设备的位置&#xff0c;包括国家、地区、城市…

CentOs中操作用户命令(添加或删除)

1、不添加任何参数,创建 zhangsan 用户 不加参数时,创建用户默认创建一个用户目录以及用户和组同名,且UID和GID相同 useradd zhangsan 用 id和 ll 命令查看一下,是否成功创建用户目录以及用户和用户组 id ll uid1003( zhangsan) gid1003( zhangsan) 组1003( zhangsan) 2…

Obsidian 与 Typora 图片兼容保存路径一致设置

目录 一、问题二、解决方法 Obsidian官网 &#xff1a; https://obsidian.md/ Your thoughts are yours. 你的想法就是你的。 Obsidian stores notes on your device, so you can access them quickly, even offline. No one else can read them, not even us. 黑曜石将笔记存储…

Java——基础语法

文章目录 1. 变量&#xff1a;变量的声明和初始化变量的作用域变量的命名规则常量 2. 运算符&#xff1a;算术运算符关系运算符逻辑运算符位运算符其他运算符 3. 流程控制&#xff1a;分支结构循环结构跳转控制 4. 类与对象&#xff1a;类的概念对象的概念类的成员构造方法和析…

深入理解深度学习——BERT派生模型:T5(Text to Text Transfer Transformer)

分类目录&#xff1a;《深入理解深度学习》总目录 T5的全称为Text to Text Transfer Transformer&#xff0c;是谷歌提出的预训练语言模型领域的通用模型&#xff0c;该模型将所有自然语言问题都转化成文本到文本的形式&#xff0c;并用一个统一的模型解决。为了得到大一统的高…