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

算法演练----24点游戏

给定4个整数,数字范围在1~13之间任意使用+-*/(),构造出一个表达式,使得最终结果为24,

方法一 算法分析:加括号和取出重复表达式
# 导入精确除法模块,使得在Python2中除法运算的行为更接近Python3(Python3中除法默认是精确除法)
from __future__ import division
# 导入组合函数,用于生成给定元素的不同组合情况
from itertools import combinations
import re
import numpy as np# Solver类用于解决通过给定数字组合,利用四则运算及一些扩展运算来得到特定目标值(这里目标值默认为24)的问题
class Solver:# 定义目标值为24,即期望通过运算得到的结果target = 24# 定义可使用的运算符列表,包含常规四则运算以及扩展的重复减和重复除('--','//'),虽然在常规数学中不太常见,但这里作为一种自定义运算来丰富组合可能性ops = ['+', '-', '*', '/', '--', '//']# 类的初始化方法,接收一个参数precise_mode(默认为False),用于控制是否精确处理运算表达式中的括号等细节def __init__(self, precise_mode=False):self.precise_mode = precise_mode# solution方法是主要的对外接口,用于寻找能得到目标值的表达式,接收一个数字列表nums作为参数def solution(self, nums):result = []# 调用dimensionality_reduction方法对输入的数字列表进行降维处理(简化数字和运算组合的复杂度),得到不同的分组情况groups = self.dimensionality_reduction(self.format(nums))for group in groups:for op in self.ops:# 调用assemble方法根据给定的两个表达式(或数字)和运算符构建一个新的表达式exp = self.assemble(group[0], group[1], op)['exp']# 调用check方法检查构建的表达式计算结果是否接近(在一定精度范围内)目标值,并且确保该表达式不在结果列表中(避免重复添加)if self.check(exp, self.target) and exp not in result:result.append(exp)# 将找到的满足条件的表达式添加等于目标值的后缀,例如 "表达式 = 24" 的形式return [exp + '=' + str(self.target) for exp in result]# dimensionality_reduction方法用于对输入的表达式(或数字)列表进行降维处理,尝试通过不同的组合和运算逐步简化def dimensionality_reduction(self, nums):result = []# 如果输入的列表长度大于2,说明还有多个元素需要进一步组合运算if len(nums) > 2:# 使用group方法对nums进行分组,每次取2个元素为一组for group in self.group(nums, 2):for op in self.ops:# 调用assemble方法将每组的两个元素根据当前运算符进行组合,得到一个新的元素(包含运算后的表达式和运算符信息),与剩余元素组成新的列表继续进行降维处理new_group = [self.assemble(group[0][0], group[0][1], op)] + group[1]result += self.dimensionality_reduction(new_group)else:# 如果列表长度小于等于2,直接返回该列表作为一种基本情况(无法再进一步分解组合了)result = [nums]return result# assemble方法根据两个表达式(或数字)以及运算符构建一个新的表达式,同时处理一些特殊情况(如交换律、括号添加等)def assemble(self, exp1, exp2, op):# 如果运算符是重复减或重复除,交换两个表达式的顺序并递归调用assemble方法,将运算符还原为单减或单除进行处理(因为重复减和重复除可能是自定义的一种处理逻辑,这里转换为常规运算来构建表达式)if op == '--' or op == '//':return self.assemble(exp2, exp1, op[0])# 如果运算符是乘或除,给两个参与运算的表达式都添加括号,以明确运算顺序(按照数学运算规则,乘除运算优先级高于加减,添加括号可以更准确地体现运算顺序)if op in "*/":exp1 = self.add_parenthesis(exp1)exp2 = self.add_parenthesis(exp2)# 如果处于精确模式(precise_mode为True),根据不同运算符进一步处理括号添加情况if self.precise_mode:if op == '-':exp2 = self.add_parenthesis(exp2)elif op == '/':exp2 = self.add_parenthesis(exp2, True)# 调用convert方法对构建好的表达式进行格式转换(可能涉及一些字符串处理,比如调整运算顺序等,具体看convert方法实现),得到最终的表达式字符串exp = self.convert(exp1['exp'] + op + exp2['exp'], op)return {'op': op, 'exp': exp}# add_parenthesis方法根据条件决定是否给表达式添加括号,用于明确运算顺序或者遵循精确模式的要求@staticmethoddef add_parenthesis(exp, is_necessary=False):# 如果满足必要添加括号的条件(比如is_necessary为True且表达式不是单纯数字,或者运算符是加减),则添加括号if (is_necessary and not exp['exp'].isdigit()) or exp['op'] in "+-":result = {'exp': '(' + exp['exp'] + ')','op': exp['op']}else:result = expreturn result# check方法用于检查给定的表达式计算结果是否在一定精度范围内接近目标值,同时捕获除零异常(因为在eval运算表达式时可能出现除数为0的情况)@staticmethoddef check(exp, target, precision=0.0001):try:# 使用eval函数计算表达式的值,然后判断与目标值的差值是否小于给定精度,若小于则认为接近目标值,返回Truereturn abs(eval(exp) - target) < precisionexcept ZeroDivisionError:return False# convert方法用于对表达式字符串进行格式转换,主要涉及根据运算符调整表达式中各部分的顺序等操作@staticmethoddef convert(exp, op):# 如果运算符是加减,定义一个正则表达式模式,用于匹配包含乘除运算或者数字的部分,然后在表达式前添加正号(可能是为了统一处理符号相关逻辑)if op in "+-":pattern = r'([\+\-]((\(.+\)|\d+)[\*\/](\(.+\)|\d+)|\d+))'exp = '+' + expelse:# 如果运算符是乘除,定义另一种正则表达式模式,用于匹配乘除运算和数字部分,然后在表达式前添加乘号(同样可能是为了统一处理逻辑)pattern = r'([\*\/](\(.+?\)|\d+))'exp = '*' + exp# 使用正则表达式查找所有匹配的部分,提取并排序后拼接成新的字符串,目的可能是为了对表达式中的各运算部分进行一种规范化整理result = ''.join(sorted([i[0] for i in re.findall(pattern, exp)]))if len(result)!= len(exp):result = expreturn result[1:]# format方法将输入的数字列表转换为包含表达式和空运算符的字典列表,方便后续统一处理(将数字视为一种简单的表达式形式)@staticmethoddef format(nums):return [{'op': ' ', 'exp': str(num)} for num in nums]# group方法用于将输入的表达式(或数字)列表按照指定数量进行分组,生成不同的分组组合情况@staticmethoddef group(exp_list, counter):index_list = [i for i in range(len(exp_list))]combination = list(combinations(index_list, counter))for group1 in combination:group2 = list(set(index_list) - set(group1))yield [[exp_list[g1] for g1 in group1],[exp_list[g2] for g2 in group2]]if __name__ == "__main__":# 定义一个变量auto_input用于控制是否自动生成输入数字,如果为True则自动生成随机数字作为输入,否则手动从用户输入获取数字auto_input = Falseif auto_input:# 使用numpy的随机数生成功能,生成4个范围在1到20之间的整数作为输入数字列表customer_input = np.random.randint(1, 20, size=4).tolist()else:customer_input = []customer_input.append(input('请输入第一个数字:'))customer_input.append(input('请输入第二个数字:'))customer_input.append(input('请输入第三个数字:'))customer_input.append(input('请输入第四个数字:'))# 创建Solver类的实例,使用默认的precise_mode(False)task = Solver()# 调用solution方法寻找能得到目标值的表达式answer = task.solution(customer_input)if len(answer) == 0:print('No solution')else:for a in answer:print(a)

第二种方案:列表切片操作实现排列组合
以下代码用于获取用户输入的四个数字,不过目前处于注释状态,如果要使用,取消注释即可
a = int(input("请输入第1个数字:"))
b = int(input("请输入第2个数字:"))
c = int(input("请输入第3个数字:"))
d = int(input("请输入第4个数字:"))
list1 = [a, b, c, d]# 定义四则运算的符号列表,包含加、减、乘、除四种符号,后续将通过这些符号的不同组合来构建表达式进行运算
symbols = ["+", "-", "*", "/"]# 外层的三个嵌套循环,用于遍历所有可能的运算符号组合
# 通过三重循环可以生成所有符号的排列情况,例如:先固定第一个符号,遍历第二个和第三个符号的所有可能组合,然后再更换第一个符号,重复此过程
for s1 in symbols:for s2 in symbols:for s3 in symbols:# 内层的四层嵌套循环,用于尝试所有数字的排列组合进行运算# 通过不断改变数字的排列顺序以及结合外层循环的符号组合,来穷举所有可能的四则运算表达式情况for i in range(4):# 取出当前排列中索引为i的数字,作为第一个参与运算的数字,赋值给oneone = list1[i]# 通过列表切片操作,获取除去当前索引为i的数字后的剩余数字列表,赋值给list2# 例如:如果i为0,那么list2就是[b, c, d];如果i为1,list2就是[a, c, d],以此类推list2 = list1[0:i] + list1[i + 1:]for j in range(3):# 从剩余数字列表list2中取出索引为j的数字,作为第二个参与运算的数字,赋值给twotwo = list2[j]# 再次通过列表切片操作,获取除去当前索引为j的数字后的剩余数字列表,赋值给list3list3 = list2[0:j] + list2[j + 1:]for k in range(2):# 从剩余数字列表list3中取出索引为k的数字,作为第三个参与运算的数字,赋值给threethree = list3[k]# 通过列表切片操作获取最后一个参与运算的数字,赋值给four# 例如:如果k为0,那么four就是list3[1];如果k为1,four就是list3[0]four = (list3[0:k] + list3[k + 1:])[0]# 根据当前取出的数字和符号组合,构建一个四则运算表达式的字符串格式,后续将通过eval函数对其进行求值运算express = "(({0}{1}{2}){3}({4}){5}{6})".format(one, s1, two, s2, three, s3, four)try:# 使用eval函数对构建好的表达式字符串进行求值运算,eval函数会按照Python的运算规则解析并计算表达式result = eval(express)# 判断运算结果是否等于24,如果等于,则表示找到了满足条件的表达式if result == 24:# 输出找到的能得到24的表达式,并在表达式后面添加 " = 24" 进行标识,然后直接退出程序print(express + " = 24")# 找到结果为24的表达式后直接退出程序,避免继续不必要的循环计算exit(0)except ZeroDivisionError:# 捕获除零异常,因为在使用除法符号构建的表达式中,可能出现除数为0的情况,# 当出现这种情况时,捕获异常并跳过本次运算,继续尝试其他数字和符号的组合continue# 如果经过所有的数字排列组合和符号组合尝试后,都没有找到结果为24的表达式,则输出提示信息
print("无法算出")
#第三种itertools 模块实现排列组合
import itertools
import copy# 获取用户输入的四个数字
a = int(input("请输入第1个数字:"))
b = int(input("请输入第2个数字:"))
c = int(input("请输入第3个数字:"))
d = int(input("请输入第4个数字:"))
inputList = [a, b, c, d]listAll = []
listSignIndex = []
listSign = []
listSet = list(itertools.permutations(inputList, 4))
# 将生成的数字全排列结果转换为列表形式,并添加到listAll列表中,
# 这样listAll中就包含了输入的四个数字的所有不同排列情况
for i in listSet:listAll.append(list(i))# 该函数的功能是根据listSignIndex列表中的索引值,将对应的运算符号添加到listSign列表中
# 索引0对应 +,索引1对应 -,索引2对应 *,索引3对应 /
def changIndexToSign():for i in listSignIndex:if i == 0:listSign.append("+")elif i == 1:listSign.append("-")elif i == 2:listSign.append("*")elif i == 3:listSign.append("/")last = []# start函数用于尝试通过不同的运算组合(四则运算),利用输入的四个数字来得到结果为24的表达式
def start():global last# 遍历所有数字的排列情况(listAll列表中的每一组数字排列)for list1 in listAll:val = list1[0]  # 先取出当前排列的第一个数字作为初始值last = copy.deepcopy(list1)  # 深拷贝当前的数字排列,用于后续构建表达式字符串# 循环遍历四种运算符号,这里通过索引来对应不同的运算符号,0表示 +,1表示 -,2表示 *,3表示 /for i in range(4):if i == 0:val += list1[1]  # 如果索引为0,执行加法运算elif i == 1:val -= list1[1]  # 如果索引为1,执行减法运算elif i == 2:val *= list1[1]  # 如果索引为2,执行乘法运算elif i == 3:val /= list1[1]  # 如果索引为3,执行除法运算val2 = val  # 保存当前运算后的结果,用于内层循环结束后恢复值# 开始内层循环,再次遍历四种运算符号,用于对第三个数字进行运算for j in range(4):if j == 0:val += list1[2]elif j == 1:val -= list1[2]elif j == 2:val *= list1[2]elif j == 3:val /= list1[2]val1 = val  # 保存当前运算后的结果,用于最内层循环结束后恢复值# 最内层循环,同样遍历四种运算符号,用于对第四个数字进行运算for k in range(4):if k == 0:val += list1[3]elif k == 1:val -= list1[3]elif k == 2:val *= list1[3]elif k == 3:val /= list1[3]# 如果经过一系列运算后,结果等于24,则记录当前使用的运算符号索引if val == 24:listSignIndex.append(i)listSignIndex.append(j)listSignIndex.append(k)changIndexToSign()return  # 找到满足条件的组合后,直接返回,结束函数else:val = val1  # 如果结果不等于24,恢复到上一次内层循环运算后的结果,继续尝试其他运算符号val = val2  # 内层循环结束后,恢复到第二次运算后的结果,继续尝试其他运算符号val = list1[0]  # 外层循环每次开始时,恢复初始值,重新进行不同运算符号组合的尝试start()
listSign.append("")
lastStr = "(("
# 构建最终的表达式字符串,根据运算符号和数字的顺序进行拼接
for i in range(4):if i == 1 or i == 2:lastStr += str(last[i]) + ")" + listSign[i]else:lastStr += str(last[i]) + ")" + listSign[i]# 输出构建好的表达式字符串,并在末尾添加 =24,表示期望的结果为24
print(lastStr + "=24")输出结果:

相关文章:

算法演练----24点游戏

给定4个整数&#xff0c;数字范围在1~13之间任意使用-*/&#xff08;&#xff09;&#xff0c;构造出一个表达式&#xff0c;使得最终结果为24&#xff0c; 方法一 算法分析&#xff1a;加括号和取出重复表达式 # 导入精确除法模块&#xff0c;使得在Python2中除法运算的行为更…...

【学习心得】Python好库推荐——tiktoken

一、tiktoken是什么&#xff1f; tiktoken是一个快速BPE分词器&#xff0c;是由 OpenAI 开发的一个用于文本处理的 Python 库&#xff0c;主要用于将文本编码为数字序列&#xff08;称为 "tokens"&#xff09;&#xff0c;或将数字序列解码为文本。这一过程被称为 &q…...

MacBook不额外安装软件,怎样投屏到安卓手机上?

提起iPhone或MacBook的投屏&#xff0c;人们总会想到airplay功能。但离开了苹果生态&#xff0c;其他品牌的手机电脑就未必配备airplay功能了。 如果想要将MacBook的电脑屏幕共享到安卓手机或平板上&#xff0c;到底要怎样做&#xff1f;需要安装什么软件吗&#xff1f; 不需要…...

flink sql + kafka + mysql 如何构建实时数仓

构建一个基于 Flink SQL、Kafka 和 MySQL 的实时数据仓库(Data Warehouse)架构,可以通过流处理的方式实现高效、实时的数据集成与分析。以下是如何利用这三者构建实时数仓的步骤与实现: 架构概述 Kafka:作为流数据平台,负责接收和传输来自不同源系统(如应用日志、传感器…...

Go语言开发基于SQLite数据库实现用户表查询详情接口(三)

背景 上一章 Go语言开发基于SQLite数据库实现用户表新增接口(二) 这一章我们实现用户表的查询详情接口 代码实现 mapper层 type UserMapper interface {GetById(id uint64) (*model.User, error)}type userMapper struct { }func (m *userMapper) GetById(id uint64) (*mod…...

(11)(2.1.7) FETtec OneWire ESCs(二)

文章目录 前言 3 组态 4 可选功能 5 SITL模拟 6 故障排除 前言 &#xff01;Note 此功能在固件版本4.1.1及更高版本上可用。 3 组态 FTW掩码 SERVO_FTW_MASK 参数选择将哪些伺服输出&#xff08;如果有的话&#xff09;路由到 FETtec ESC。更改此参数后需要重新启动。…...

Springboot maven常见依赖、配置文件笔记

pom.xml文件 一、<parent> 在Maven项目中&#xff0c;pom.xml 文件中的 <parent> 元素用于定义父项目的坐标。使用 <parent> 可以实现继承机制&#xff0c;子项目可以从父项目继承配置信息&#xff0c;比如依赖管理、插件配置等。这样可以避免在多个子项目…...

Ceph后端两种存储引擎介绍

Ceph是一个可靠的、自治的、可扩展的分布式存储系统&#xff0c;它支持文件系统存储、块存储、对象存储三种不同类型的存储&#xff0c;以满足多样存储的需求。在Ceph的存储架构中&#xff0c;FileStore和BlueStore是两种重要的后端存储引擎&#xff0c;下面将分别进行详细介绍…...

C++入门基础知识140—【关于C++ 类构造函数 析构函数】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 类构造函数 & 析构函数的相关内容…...

基于标签相关性的多标签学习

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

macOS系统下使用SQLark连接达梦数据库

目录 下载 SQLark 客户端 安装 SQLark 客户端 SQLark用户界面 使用SQLark连接达梦数据库 1. 选择达梦数据库 2. 输入连接信息 3. 测试连接 4. 创建连接 5. 验证连接成功 作为一名数据库开发者&#xff0c;在macOS系统上找到一款支持达梦数据库的数据库开发和管理工具&…...

爬虫如何解决短效代理被封的问题?

在数据采集的征途上&#xff0c;短效代理如同一把双刃剑&#xff0c;它既能为我们带来速度和效率&#xff0c;也可能因为频繁更换IP地址而遭遇被封禁的风险。那么&#xff0c;作为数据采集er的我们&#xff0c;该如何巧妙应对&#xff0c;确保爬虫的稳定运行呢&#xff1f;今天…...

Jmeter基础篇(22)服务器性能监测工具Nmon的使用

一、前言 我们在日常做压测的过程中&#xff0c;不仅仅需要监控TPS&#xff0c;响应时间&#xff0c;报错率等这些系统基础性能数据&#xff0c;还需要对服务器的性能&#xff08;如CPU、磁盘、内存、网络IO等&#xff09;做监控&#xff0c;以求对系统运行过程中的硬件性能有…...

Spring Boot 集成 RabbitMQ:消息生产与消费详解

在现代微服务架构中&#xff0c;消息队列扮演着至关重要的角色&#xff0c;RabbitMQ 是其中一种广泛使用的消息中间件。本文将详细介绍如何在 Spring Boot 项目中集成 RabbitMQ&#xff0c;实现消息的生产和消费&#xff0c;并提供相应的代码示例。 一、环境准备与依赖配置 首…...

JSON-RPC-CXX深度解析:C++中的远程调用利器

一、引言 1. JSON-RPC 简介及其在 C 开发中的重要性 JSON-RPC&#xff08;JavaScript Object Notation - Remote Procedure Call&#xff09;是一种基于 JSON 格式的远程过程调用协议。在 C 开发中&#xff0c;它扮演着至关重要的角色。随着软件系统的日益复杂和分布式架构的…...

【后端速成Vue】模拟实现翻译功能

前言&#xff1a; 本期将会介绍 Vue 中的 watch 侦听器&#xff0c;它语法是怎么样的呢&#xff1f;具有怎样的功能呢&#xff1f;最后用模拟实现百度翻译来更进一步练习 watch 侦听器 篮球哥找工作专属IT岗位内部推荐&#xff1a; 专属内推链接&#xff1a;内推通道 1、认识翻…...

人脸识别技术:从算法到深度学习的全面解析

一、人脸识别技术综述 人脸识别技术作为一种重要的生物识别技术&#xff0c;在当今社会中具有举足轻重的地位。它广泛应用于各个领域&#xff0c;如金融领域的实名认证、安保领域的门禁系统、通行领域的火车站和地铁站检票、泛娱乐领域的美颜相机和短视频特效处理、公安和司法…...

WPF学习之路,控件的只读、是否可以、是否可见属性控制

C#的控件学习之控件属性操作 控件的只读、是否可以、是否可见&#xff0c;是三个重要的参数&#xff0c;在很多表单、列表中都有用到&#xff0c;正常表单控制可以在父层主键控制参数是否可以编辑和可见&#xff0c;但是遇到个别字段需要单独控制时&#xff0c;可以在初始化wi…...

植物神经紊乱不用怕,科学锻炼助你找回平衡✨

在这个快节奏、高压力的时代&#xff0c;你是否经常感到身心疲惫&#xff0c;情绪波动大&#xff0c;甚至偶尔还会出现心慌、失眠、消化不良等症状&#xff1f;这些可能都是植物神经功能紊乱在作祟&#xff01;&#x1f631;别担心&#xff0c;今天就来聊聊如何通过科学锻炼&am…...

shell 100例

1、每天写一个文件 (题目要求&#xff09; 请按照这样的日期格式(xxxx-xx-xx每日生成一个文件 例如生成的文件为2017-12-20.log&#xff0c;并且把磁盘的使用情况写到到这个文件中不用考虑cron&#xff0c;仅仅写脚本即可 [核心要点] date命令用法 df命令 知识补充&#xff1…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#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…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...