当前位置: 首页 > news >正文

Qt C++春晚刘谦魔术约瑟夫环问题的模拟程序

什么是约瑟夫环问题?

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
分析:
(1)由于对于每个人只有死和活两种状态,因此可以用布尔型数组标记每个人的状态,可用true表示死,false表示活。
(2)开始时每个人都是活的,所以数组初值全部赋为false。
(3)模拟杀人过程,直到所有人都被杀死为止。

魔术

1、4张牌对折后撕开,就是8张,叠放在一起就是ABCDABCD。注意,ABCD四个数字是完全等价的。
2、根据名字字数,把顶上的牌放到下面,但怎么放都不会改变循环序列的相对位置。譬如2次,最后变成CDABCDAB;譬如3次,最后换成DABCDABC。但无论怎么操作,第4张和第8张牌都是一样的。
3、把顶上3张插到中间任意位置。这一步非常重要!因为操作完之后必然出现第1张和第8张牌是一样的!以名字两个字为例,可以写成BxxxxxxB(这里的x是其他和B不同的牌)。
4、拿掉顶上的牌放到一边,记为B。剩下的序列是xxxxxxB,一共7张牌。
5、南方人/北方人/不确定,分别拿顶上的1/2/3张牌插到中间,但是不会改变剩下7张牌是xxxxxxB的结果。
6、男生拿掉1张,女生拿掉2张。也就是男生剩下6张,女生剩下5张。分别是xxxxxB和xxxxB。
7、把最顶上的放到最底下,循环7次,男生和女生分别会是xxxxBx和xxBxx。
8、最后执行约瑟夫环过程!操作到最后只剩下1张。当牌数为6时(男生),剩下的就是第5张牌;当牌数为5时(女生),剩下的就是第3张牌。就是第4步拿掉的那张牌!

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1157e96989d6436ea8772e76b1130263.png

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <vector>
#include "brand.h"
#include <QPushButton>
#include <QRadioButton>
#include <QLineEdit>
#include <QLayout>
#include <QStackedWidget>
#include <QSplitter>
#include <QButtonGroup>
class Step: public QWidget
{
public:Step(QWidget *parent = 0):QWidget(parent){QVBoxLayout* vbox = new QVBoxLayout(this);QHBoxLayout* hboxLabel = new QHBoxLayout;hboxChoose = new QHBoxLayout;QHBoxLayout* hboxBtn = new QHBoxLayout;label = new QLabel(this);hboxLabel->addStretch();hboxLabel->addWidget(label);hboxLabel->addStretch();hboxBtn->addStretch();vbox->addLayout(hboxLabel);vbox->addLayout(hboxChoose);vbox->addLayout(hboxBtn);}void SetText(QString text){label->setText(text);}QHBoxLayout* GetChooseLayout(){return hboxChoose;}virtual bool Check() {return true;}
private:QLabel* label;QHBoxLayout* hboxChoose;
};class Start: public Step
{
public:Start(QWidget *parent = 0):Step(parent){SetText("请输入四个数字、字母或汉字");edit = new QLineEdit(this);edit->setPlaceholderText("请输入四个数字、字母或汉字");GetChooseLayout()->addWidget(edit);}QString GetStr(){return edit->text();}bool Check() {return edit->text().size() == 4;}private:QLineEdit* edit;
};class First: public Step
{
public:First(QWidget *parent = 0):Step(parent){SetText("4张牌对折后撕开");}
};class Second: public Step
{
public:Second(QWidget *parent = 0):Step(parent){SetText("请输入您的名字");edit = new QLineEdit(this);edit->setPlaceholderText("请输入您的名字");GetChooseLayout()->addWidget(edit);}int GetNumber(){return edit->text().size();}bool Check() {return edit->text().size() > 0;}
private:QLineEdit* edit;
};class Third: public Step
{
public:Third(QWidget *parent = 0):Step(parent){SetText("把顶上3张插到中间任意位置");radio = new QRadioButton("第一张后面",this);radio1 = new QRadioButton("第二张后面",this);radio2 = new QRadioButton("第三张后面",this);radio3 = new QRadioButton("第四张后面",this);GetChooseLayout()->addWidget(radio);GetChooseLayout()->addWidget(radio1);GetChooseLayout()->addWidget(radio2);GetChooseLayout()->addWidget(radio3);radio->setChecked(true);}int GetChoose(){if(radio->isChecked())return 1;if(radio1->isChecked())return 2;if(radio2->isChecked())return 3;if(radio3->isChecked())return 4;return 1;}
private:QRadioButton* radio;QRadioButton* radio1;QRadioButton* radio2;QRadioButton* radio3;
};class Four: public Step
{
public:Four(QWidget *parent = 0):Step(parent){SetText("拿掉顶上的牌放到一边");}
};class Five: public Step
{
public:Five(QWidget *parent = 0):Step(parent){SetText("南方人/北方人/不确定,分别拿顶上的1/2/3张牌插到中间");QVBoxLayout* vbox = new QVBoxLayout;QHBoxLayout* hbox = new QHBoxLayout;QHBoxLayout* hbox1 = new QHBoxLayout;QButtonGroup* group = new QButtonGroup(this);QButtonGroup* group1 = new QButtonGroup(this);radio = new QRadioButton("南方人",this);radio1 = new QRadioButton("北方人",this);radio2 = new QRadioButton("不确定",this);radio3 = new QRadioButton("第一张后面",this);radio4 = new QRadioButton("第二张后面",this);radio5 = new QRadioButton("第三张后面",this);hbox->addWidget(radio);hbox->addWidget(radio1);hbox->addWidget(radio2);hbox1->addWidget(radio3);hbox1->addWidget(radio4);hbox1->addWidget(radio5);group->addButton(radio);group->addButton(radio1);group->addButton(radio2);group1->addButton(radio3);group1->addButton(radio4);group1->addButton(radio5);vbox->addLayout(hbox);vbox->addLayout(hbox1);GetChooseLayout()->addLayout(vbox);radio2->setChecked(true);radio3->setChecked(true);}int GetChoose(){if(radio->isChecked())return 1;else if(radio1->isChecked())return 2;else if(radio2->isChecked())return 3;return 1;}int GetChoose1(){if(radio3->isChecked())return 1;else if(radio4->isChecked())return 2;else if(radio5->isChecked())return 3;return 1;}
private:QRadioButton* radio;QRadioButton* radio1;QRadioButton* radio2;QRadioButton* radio3;QRadioButton* radio4;QRadioButton* radio5;
};class Six: public Step
{
public:Six(QWidget *parent = 0):Step(parent){SetText("男生拿掉1张,女生拿掉2张");radio = new QRadioButton("男生",this);radio1 = new QRadioButton("女生",this);GetChooseLayout()->addWidget(radio);GetChooseLayout()->addWidget(radio1);radio->setChecked(true);}int GetChoose(){if(radio->isChecked())return 1;if(radio1->isChecked())return 2;return 1;}
private:QRadioButton* radio;QRadioButton* radio1;
};class Seven: public Step
{
public:Seven(QWidget *parent = 0):Step(parent){SetText("把最顶上的放到最底下,循环7次");}
};class Last: public Step
{
public:Last(QWidget *parent = 0):Step(parent){SetText("好运留下来");flag = 1;}void Init(){SetText("好运留下来");flag = 1;}void ChangeText(){switch(flag){case 0:flag = 1;SetText("好运留下来");break;case 1:flag = 0;SetText("烦恼都丢掉");break;default:break;}}int GetFlag(){return flag;}private:int flag;
};class Widget : public QSplitter
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();
private:void StartGetData();void FirstStep();void SecondStep();void ThridStep();void FourStep();void FiveStep();void SixStep();void SevenStep();void LastStep();void UpdateData();
protected slots:void OnClicked(bool);
private:std::vector<Brand*> m_vecBrand;QString m_firstCard;QLabel* label;QPushButton* btn;QStackedWidget* m_stackedWidget;bool bOver;
};#endif // WIDGET_H

.cpp

#pragma execution_character_set("utf-8")
#include "widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QSplitter(parent)
{setOrientation(Qt::Vertical);label = new QLabel("qweqwe",this);QWidget* widget = new QWidget(this);m_stackedWidget = new QStackedWidget(this);addWidget(label);addWidget(widget);setStretchFactor(1,2);m_stackedWidget->addWidget(new Start);m_stackedWidget->addWidget(new First);m_stackedWidget->addWidget(new Second);m_stackedWidget->addWidget(new Third);m_stackedWidget->addWidget(new Four);m_stackedWidget->addWidget(new Five);m_stackedWidget->addWidget(new Six);m_stackedWidget->addWidget(new Seven);m_stackedWidget->addWidget(new Last);QHBoxLayout* hbox = new QHBoxLayout;QVBoxLayout* vbox = new QVBoxLayout;btn = new QPushButton("下一步",this);hbox->addStretch();hbox->addWidget(btn);vbox->addWidget(m_stackedWidget);vbox->addLayout(hbox);widget->setLayout(vbox);connect(btn, SIGNAL(clicked(bool)), this, SLOT(OnClicked(bool)));bOver = false;
}Widget::~Widget()
{}void Widget::StartGetData()
{Start* start = (Start*)m_stackedWidget->widget(0);QString str = start->GetStr();for(int i=0; i<str.length(); i++){Brand* brand = new Brand(QString(str[i]));m_vecBrand.push_back(brand);}
}void Widget::FirstStep()
{Start* start = (Start*)m_stackedWidget->widget(0);QString str = start->GetStr();for(int i=0; i<str.length(); i++){Brand* brand = new Brand(QString(str[i]));m_vecBrand.push_back(brand);}
}void Widget::SecondStep()
{Second* second = (Second*)m_stackedWidget->widget(2);int number = second->GetNumber();for(int i=0; i<number; i++){Brand* brand = m_vecBrand[0];m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.push_back(brand);}
}void Widget::ThridStep()
{Third* third = (Third*)m_stackedWidget->widget(3);int number = third->GetChoose();Brand* brand = m_vecBrand[0];Brand* brand1 = m_vecBrand[1];Brand* brand2 = m_vecBrand[2];m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());std::vector<Brand*> vecBrand;for(int i=0; i<m_vecBrand.size(); i++){vecBrand.push_back(m_vecBrand[i]);if(number == i + 1){vecBrand.push_back(brand);vecBrand.push_back(brand1);vecBrand.push_back(brand2);}}m_vecBrand = vecBrand;
}void Widget::FourStep()
{m_firstCard = m_vecBrand[0]->GetStr();setWindowTitle("当前选择牌为:"+ m_firstCard);m_vecBrand.erase(m_vecBrand.begin());
}void Widget::FiveStep()
{Five* five = (Five*)m_stackedWidget->widget(5);int number = five->GetChoose();int number1 = five->GetChoose1();std::vector<Brand*> vecBrand;switch (number) {case 1:vecBrand.push_back(m_vecBrand[0]);m_vecBrand.erase(m_vecBrand.begin());break;case 2:vecBrand.push_back(m_vecBrand[0]);vecBrand.push_back(m_vecBrand[1]);m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());break;case 3:vecBrand.push_back(m_vecBrand[0]);vecBrand.push_back(m_vecBrand[1]);vecBrand.push_back(m_vecBrand[2]);m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());break;default:break;}std::vector<Brand*> vecBrand1;for(int i=0; i<m_vecBrand.size(); i++){vecBrand1.push_back(m_vecBrand[i]);if(number1 == i + 1){vecBrand1.insert(vecBrand1.end(), vecBrand.begin(), vecBrand.end());}}m_vecBrand = vecBrand1;
}void Widget::SixStep()
{Six* six = (Six*)m_stackedWidget->widget(5);int number = six->GetChoose();switch (number) {case 1:m_vecBrand.erase(m_vecBrand.begin());break;case 2:m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.erase(m_vecBrand.begin());break;default:break;}
}void Widget::SevenStep()
{for(int i=0; i<7; i++){Brand* brand = m_vecBrand[0];m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.push_back(brand);}
}void Widget::LastStep()
{Last* last = (Last*)m_stackedWidget->widget(8);int flag = last->GetFlag();switch (flag) {case 0:m_vecBrand.erase(m_vecBrand.begin());break;case 1:Brand* brand = m_vecBrand[0];m_vecBrand.erase(m_vecBrand.begin());m_vecBrand.push_back(brand);break;}last->ChangeText();
}void Widget::UpdateData()
{QString str;for(int i=0; i<m_vecBrand.size(); i++){str+= m_vecBrand[i]->GetStr();}label->setText(str);
}void Widget::OnClicked(bool)
{if(bOver){setWindowTitle("magic");Last* last = (Last*)m_stackedWidget->widget(8);last->Init();bOver = false;btn->setText("下一步");m_stackedWidget->setCurrentIndex(0);return;}Step* step = (Step*)m_stackedWidget->currentWidget();if(!step->Check())return;if(m_vecBrand.size() == 1){m_vecBrand.clear();Last* last = (Last*)m_stackedWidget->widget(8);last->SetText("之前的牌为:"+ m_firstCard+ " 对上否?");bOver = true;btn->setText("重新开始");return;}switch (m_stackedWidget->currentIndex()) {case 0://4张牌StartGetData();break;case 1://对折撕开FirstStep();break;case 2://根据名字字数,把顶上的牌放到下面SecondStep();break;case 3://把顶上3张插到中间任意位置ThridStep();break;case 4://拿掉顶上的牌放到一边FourStep();break;case 5://南方人/北方人/不确定,分别拿顶上的1/2/3张牌插到中间FiveStep();break;case 6://男生拿掉1张,女生拿掉2张SixStep();break;case 7://把最顶上的放到最底下,循环7次SevenStep();break;case 8://好运留下来 烦恼都丢掉LastStep();break;default:break;}UpdateData();if(m_stackedWidget->currentIndex() + 1 < m_stackedWidget->count())m_stackedWidget->setCurrentIndex(m_stackedWidget->currentIndex() + 1);
}

相关文章:

Qt C++春晚刘谦魔术约瑟夫环问题的模拟程序

什么是约瑟夫环问题&#xff1f; 约瑟夫问题是个有名的问题&#xff1a;N个人围成一圈&#xff0c;从第一个开始报数&#xff0c;第M个将被杀掉&#xff0c;最后剩下一个&#xff0c;其余人都将被杀掉。例如N6&#xff0c;M5&#xff0c;被杀掉的顺序是&#xff1a;5&#xff…...

Typora+PicGO+腾讯云COS做图床

文章目录 Typora&#xff0b;PicGO&#xff0b;腾讯云COS做图床一、为什么使用图床二、Typora、PicGO和腾讯云COS介绍三、下载Typora和PicGOTyporaPicGO 四、配置Typora、PicGO和腾讯云COS腾讯云COS配置PicGO配置Typora配置 Typora&#xff0b;PicGO&#xff0b;腾讯云COS做图床…...

WebStorm | 如何修改webstorm中新建html文件默认生成模板中title的初始值

在近期的JS的学习中&#xff0c;使用webstorm&#xff0c;总是要先新建一个html文件&#xff0c;然后再到里面书写<script>标签&#xff0c;真是麻烦&#xff0c;而且标题也是默认的title&#xff0c;想改成文件名还总是需要手动去改 经过小小的研究&#xff0c;找到了修…...

大厂的数据质量中心系统设计

日常工作中&#xff0c;数据开发上线完一个任务后并不是就可以高枕无忧&#xff0c;时常因上游链路数据异常或者自身处理逻辑的 BUG 导致产出的数据结果不可信。而问题发现可经历较长周期&#xff08;尤其离线场景&#xff09;&#xff0c;往往是业务方通过上层数据报表发现数据…...

docker (一)-简介

1.什么是docker Docker 是一个开源的应用容器引擎&#xff0c;由于docker影响巨大&#xff0c;今天也用"Docker" 指代容器化技术。 2.docker的优势 一键部署&#xff0c;开箱即用 容器使用基于image镜像的部署模式&#xff0c;image中包含了运行应用程序所需的一…...

全国乙卷高考理科数学近年真题的选择题练一练和解析

虽然很多中小学才陆陆续续开学&#xff0c;但是高三的学子们一定是过年的时候也在抓紧备考&#xff0c;毕竟&#xff0c;距离2024年高考只剩下不到四个月了。 如何在最后四个月的时间提高成绩&#xff1f;以高考真题为抓手是一个不错的方法&#xff0c;因为真题都是严格遵循考试…...

uniapp运动课程健身打卡系统微信小程序

考虑到实际生活中在我来运动管理方面的需要以及对该系统认真的分析,将系统分为小程序端模块和后台管理员模块&#xff0c;权限按管理员和用户这两类涉及用户划分。 (a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有&#xff1a;首页、个人中心、用户管理、课程类别管理…...

IP详细地理位置查询:技术原理与应用实践

IP地址是互联网上设备的唯一标识&#xff0c;在网络安全、个性化服务等领域具有重要意义。通过IP详细地理位置查询&#xff0c;可以获取到IP地址所在地的具体信息&#xff0c;为网络管理、定位服务等提供支持。IP数据云将深入探讨IP详细地理位置查询的技术原理、应用实践以及相…...

SpringBoot2整合支付宝进行沙箱支付

目录 1. 进入支付宝的开放平台 2. 导入Maven依赖 3. 配置application.yml文件 NATAPP.cn(内网穿透工具) 注册登录 下载 4. 后端配置 5. 测试 1. 进入支付宝的开放平台 开发平台: 支付宝开放平台 登录后,点击控制台 点击最下面的沙箱 2. 导入Maven依赖 <dependency…...

世界顶级名校计算机专业,都在用哪些书当教材?

清华、北大、MIT、CMU、斯坦福的学霸们在新学期里要学什么&#xff1f;今天我们来盘点一下那些世界名校计算机专业采用的教材。 欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &…...

Linux内核解读

来自鹅厂架构师 作者&#xff1a;aurelianliu 工作过程中遇到的调度、内存、文件、网络等可以参考。 1.os运行态 X86架构&#xff0c;用户态运行在ring3&#xff0c;内核态运行在ring0&#xff0c;两个特权等级。 &#xff08;1&#xff09;内核、一些特权指令&#xff0c;例…...

在VS里使用C#制作窗口应用

新建项目 创建项目的时候搜索net&#xff0c;选择这个。 打开应该是这样 第一个控件 选择公共控件 - PictureBox - 拖入Form 在Image处选择上传本地资源&#xff0c;建议上传一个小一点的图片。 修改一下尺寸。 ctrls 保存 从“属性”切换到“事件” 双击Click事件…...

Nginx的流式响应配置

Nginx的流式响应配置 使用ChatGPT的能力在聊天时来实现打字机效果&#xff0c;因此需要服务端接口进行流式响应&#xff0c;碰到了几个问题&#xff1a; 1、服务端明明配置了响应头的Content-Type为&#xff1a;text/event-stream&#xff0c;但前端仍然不是流式接收内容。 2、…...

Excel练习:双层图表

Excel练习&#xff1a;双层图表 学习视频Excel制作双层图表&#xff0c;很多人都不会&#xff0c;其实只需1步操作就够了&#xff01;_哔哩哔哩_bilibili ​​ 通过调整两个图形的显示范围实现 增加折现图的负数显示范围&#xff0c;使折现图仅出现在整体图形的上方增加柱形…...

2024展望龙年,索蝶音乐成立

近日,北京索蝶文化传媒有限公司在北京成立,引起了业内众多公司的关注。作为翰扬影视的兄弟公司,索蝶音乐致力于音乐、练习生两大市场的深耕及探索,立志三年内成为国内市场的主流厂牌。 公司负责人刘孝林先生表示,索蝶音乐以艺人经纪、艺人包装、音乐制作与发行、练习生选拔与培…...

什么是 Wake-on-LAN?如何使用 Splashtop 远程喊醒电脑

在当今数字互联的世界里&#xff0c;远程访问电脑已不仅仅是一种便利&#xff0c;而是许多人的需要。无论是远程工作、IT 支持&#xff0c;还是管理整个网络中的计算机群&#xff0c;我们都必须掌握正确的工具和技术。 其中一项在远程访问中发挥关键作用的技术是 Wake-on-LAN …...

正则表达式的一些高级用法

不允许出现某个单词&#xff0c;使用?! (?!Pattern).\.matches 表示.matches之前的不能是Pattern非贪婪匹配&#xff0c;在匹配项后加? matches\((.*?)\) 这里在.*后加问号&#xff0c;表示尽可能少的匹配。\w表示字母、数字和下划线防范redos攻击&#xff0c;可使用Cyber-…...

第3.1章:StarRocks数据导入——Insert into 同步模式

一、概述 在StarRocks中&#xff0c;insert的语法和mysql等数据库的语法类似&#xff0c;并且每次insert into操作都是一次完整的导入事务。 主要的 insertInto 命令包含以下两种&#xff1a; insert into tbl select ...insert into tbl (col1, col2, ...) values (1, 2, ...…...

Docker基本使用【数据卷的挂载及常用命令】

镜像和容器&#xff1a;当我们利用docker安装应用时&#xff0c;Docker会自动搜索并下载应用的镜像&#xff08;image&#xff09;&#xff0c;镜像不仅包含应用本身还包含应用所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离的环境&#xff0c;称为容器&am…...

5G DTU实现燃气管道数据采集远程管理

随着物联网技术与智慧城市的不断发展&#xff0c;燃气管道户外组网的需求逐渐浮现。在户外组网应用中5G DTU&#xff08;Data Terminal Unit&#xff09;发挥着至关重要的作用。5G DTU可用于数据采集、传输与远程管理&#xff0c;能够实现燃气数据的单点或多点采集和传输&#…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…...