“索引”是为了能够更快地查询数据。比如一本书的目录,就是这本书的内容的索引,读者可以通过在目录中快速查找自己想要的内容,然后根据页码去找到具体的章节。
优势:以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序;
劣势:索引本身也是表,因此会占用存储空间。索引的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表
我们在下面三种情况下会考虑给字段添加索引:
1.数据量庞大
毋庸置疑,数据量庞大时添加索引明显能够提升查询效率
2.字段作为查询条件
该字段老是出现在where语句后面,老是被扫描。
3.该字段很少进行插入,修改,删除操作
因为做这些操作,索引需要重新排序
注意:1.主键上,以及unique字段上都会自动添加索引的(所以查询的时候尽量通过有主键或者带有unique字段进行查询)
2.建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能
create index student_name_index on student(name);
这条命令的意思是:在学生表student的name字段上创建索引,名字是student_name_index,使用的时候结合自己的表来替换对应的东西。
drop index student_name_index on student;
这条命令的意思是:将学生表student上的student_name_index索引对象删除,使用的时候结合自己的表来替换对应的东西。
举例:
对一张comment表的content字段进行查询,发现查询出来的行数是19行,而这张表的行数也是19行,没有使用索引检索,如下:
explain select * from comment where content = '很好';
给该字段创建索引,然后再进行查看。
有使用索引进行查询,查询出来的条数是两条(因为我这个表里content字段有两条记录是“很好”。)
单一索引:顾名思义,就是在一个字段上添加索引。
语法跟上面说的一样,这里不重复。
主键索引:这是在主键上添加索引,建表的时候通过 PRIMARY KEY(字段) 这种方式来设置主键,同时自动添加索引,注意,一张表只能有一个主键。
唯一索引:与单一索引类似,索引列的值必须唯一,允许有空值。
create unique index 索引的名字 on 表名(字段);
组合索引:两个或者更多的字段添加索引
alter table 表名 add index 索引的名字(字段,字段,字段);
例如:
字段采用模糊查询的时候是以“%”开头了,这种情况要尽量避免,如下图,查询还是全部查出来了。
查询的时候,使用or。使用or那么要求or两边的条件字段都要有索引,才会走索引,如果其中一边有一个字段没有索引,那么另一个字段上的索引也会失效,如下图。
在查询条件中标记为索引的列参与运算,索引就失效。
在查询条件中标记为索引的列使用函数,索引就失效了。
使用复合索引的时候,查询时没有使用最左侧的列进行查询,索引失效。
MySQL 中的索引是通过 B+ 树实现的。B+ 树是⼀种多叉树,它可以将数据按照⼀定的顺序组织起来,从而提高查询效率。
B+ 树的所有数据都存储在叶子节点上,而非叶子节点只存储索引,这样可以提高数据查询效率。B+ 树的叶子节点之间使用指针相连,这样可以实现区间查找,也就是说,可以快速定位某个区间内的数据。
在 MySQL 中,B+ 树的实现主要是通过 InnoDB 存储引擎来实现的。InnoDB 存储引擎中的索 引主要有聚簇索引和辅助索引两种类型,聚簇索引是根据主键创建的索引,而辅助索引是根据非主键列创建的索引。
对于辅助索引,MySQL 中会同时创建⼀个对应的聚簇索引,这样可以提高查询效率。
覆盖索引和联合索引是数据库中常见的两种索引类型。 覆盖索引是指⼀个包含了所有查询需要的列的索引,查询时可以直接从索引中取到需要的数据,而不需要再回到表中查找,从而可以提高查询效率。 联合索引是指使用多个列组合起来作为⼀个索引,可以同时查询多个列,以提高查询效率。联合索引可以包含多个列,但是查询时只能使用前缀列进行查询,即只有在查询中使用了联合索引的前几个列,才能利用联合索引进行查询。如果查询中没有使用前缀列,那么联合索引就不能发挥作用,需要使用单独的索引或全表扫描。最左前缀匹配原则是指如果⼀个联合索引包含了多个列,那么在查询时只能使用前面的列进行匹配。 例如,⼀个联合索引包含了 A、B、C 三列,那么查询时只能使用A、AB 或 ABC 进行匹配, 而不能只使用 B 或 C 进行匹配。这是因为如果查询时使用的列不是最左前缀列,那MySQL 就⽆法使⽤索引进行查询,会导致全表扫描,从而降低查询效率。 在实际的应用中,覆盖索引和联合索引可以结合使用,以提高查询效率。同时,使用最左前缀匹配原则可以让我们更加合理地设计索引,从而提高查询性能。
打算好好学习数据结构。刚接触的时候感觉一点都不懂,老师讲的也不知道。。-经过这两周的学习,模模糊糊的有点知道了。先从最基本的最基本的“顺序表”入手。什么都不用管,首先要定义一个常量(常量的好处:修改容易。。。)因为我们要使用数组来做。#include<stdio.h>; #defineMAXSIZE100/*这个就是定义一个常量,待会有用到*/<!--more--> typedefstruct /*基本的定义类型。*/ { intid[100];/*我们只做学生的ID*/ intlen;/*顺序表的长度,我们姑且这么认为*/ }Student,*PStudent/*这个类型的名称,后面那个指针是用来指向这个结构体的,以后可以用L->XX来取元素什么的,很方便*/ /*以上就是定义个一个完整的新类型了。下面我们还要进行:初始化(INITIATE),求表长度(LENGTH),取元素(GET),定位(LOCATE),插入(INSERT)*/ voidINITIATE(PStudentL)/*因为前面使用了指针来操作。*/ { L->l
小勤:PowerQuery里有没有类似Excel里的Datedif函数可以用来计算年龄的啊?大海:没有。唉……小勤:那怎么办呢?大海:按照最原始的通过日期的方法来算咯,其实也不难。小勤:那不是要先判断出生日期的月日是否比当前日期的月日大?感觉很麻烦。大海:还好吧,因为通过函数Date.ToText可以直接提取月日的格式,比如:小勤:啊,可以这样的话感觉好像有简单了一丢丢,不要考虑月和日分开判断的问题了。大海:对的,所以,你只要判断月日组合的文本大小就可以了。小勤:判断文本大小?不是要转成数字来比大小吗?大海:不需要啦,当你将日期转换为4位的文本时,文本的排序和再转换为数字的排序是一样的,比如“0513”比“0512”大,跟513比512大是一样的。小勤:啊,那就是可以转换好就直接比较了,那公式还是很长啊,如果“生日的月日大于等于当前日期月日”,那么“年份差减1”,否则“年份差”……大海:也不需要,月日比较的结果就是true或false,这是可以直接用Number.From函数转为1或0的,所以,最后公式只要用年份差减去转换为数字的判断结果就好了:=Date.Year([当前日期]) -
Java博大精深,也一直被誉为互联网霸主;我们都知道互联网技术结构之复杂,所以Java的技术组件、架构也非常之多和复杂;其实学习Java学到什么程度算是精通,这个其实没有盖棺定论的,也不是说你拿个年薪几十万的offer就可以自诩精通了。我认为,如果市面上这些资料、书籍你都啃的差不多,你能在所有的Java程序员中跻身前0.1%的话,你就可以达到"精通"这个阶段了,因为没人比你强了,你当然是精通了。面向过程与面向对象的区别,由“如何把大象装进冰箱”来看:一、面向过程为了把大象装进冰箱,需要3个过程。思路:1、把冰箱门打开(得到打开门的冰箱)。2、把大象装进去(打开门后,得到里面装着大象的冰箱)。3、把冰箱门关上(打开门、装好大象后,获得关好门的冰箱)。根据上面的思路,可以看到,每个过程都有一个阶段性的目标,依次完成这些过程,就能把大象装进冰箱。二、面向对象为了把大象装进冰箱,需要做三个动作(或者叫行为)。每个动作有一个执行者,它就是对象。思路:1、冰箱,你给我把门打开。2、冰箱,你给我把大象装进去(或者说,大象,你给我钻到冰箱里去)。3、冰箱,你给我把门关上。依次完成这
业界有个说法,认为ERP经过了20多年的发展,理念已经不行了、跟不上时代了;而后起之秀“中台”,经历了兴起、火爆、被唱衰等阶段,也已经凉凉了。 再加上,最近一年“低代码”、“零代码”的迅速崛起,似乎企业数字化领域又要“改朝换代”了。难道ERP“死”了,“中台”凉了,“低代码”要称王了? 其实,企业数字化领域从来都不缺新概念,每隔几年就来一波。但是,在企业里搞数字化转型的朋友就懵圈了,这么多新概念出来,你们倒是很“敏捷”,可是企业消化不了呀。企业里的MRP2报表数字还没对齐,中台就来了,说是要“去烟囱”化,花了几千万上“中台”。刚把“数据孤岛”打通,又说要搞“低代码”了,要干掉程序员,把企业数字化的能力重新交回给业务人员。01 ERP,中台,低代码的本质是什么? 我们先来思考Why的问题,ERP、中台、低代码的本质是什么?任何的企业治理软件都只是技术手段,技术解决的是业务的问题,企业治理软件的本质就是企业治理思想的体现。所以,企业购买软件,实际上买的是企业治理方法论。是要解决企业运作过程中出现的问题,是要降本增效。否则excel表格就够了,要说灵活的话,哪个软件比excel更灵活?那么
作者:KaylaMatthews翻译:陈超校对:吴金笛本文约1800字,建议阅读5分钟。本文为你介绍数据科学如何用于更好地学习和理解COVID-19。标签:数据科学阅读这篇概览,你将获得对数据科学家们是如何努力理解COVID-19拥有更清楚的认识。图片来源:联合国随着新型冠状病毒的升级,COVID-19的迅速传播和全球性的影响使得人们感到无助和恐惧,并迫使人们在日常生活的诸多方面都发生了变化。然而,人们仍然可以通过了解数据科学家们在学习COVID-19上的努力,在这些不确定的时期感受到一丝希望的曙光。数据科学能够给出冠状病毒的精确图片医疗专家和其他人必须获得关于冠状病毒日常变化的正确并且最新的信息。包括约翰·霍普金斯大学,IBM和Tableau在内的几个组织已经发布了可以提供病毒发病情况的实时观测交互式数据库。这些资源中的大多数的数据来源是想美国疾病控制和预防中心(CDC)和世界卫生组织(WHO)这样值得信任的机构。数据来源也包括了直接导向这些机构的链接,以便于人们拥有更快捷、容易的方法获得可信赖的信息。使用这些数据库能够告知人们确诊病例、死亡情况以及治愈情况。无论一个人是在抗疫的前线
项目或者设备得供应商投标价格得方法有很多。一种常见得方法是:首先估计项目或设备得成本基值,然后确定投标价格再成本基值得基础上得提高比例,即提价比例,最后形成投标报价价格。在项目投标市场竞争比较激烈,而且项目或者设备的供应商与子供应商数量有限、信息基本对称的情况下,项目成本估计基值在不同的投标方之间差别可能不大。这时,提价比例会成为投标方报价价格的主要影响因素。确定合适的投标提价不是一件容易的事情。项目或者设备供应商既需要考虑价格足够低以便提高中标概率,又要考虑中标后价格可以在涵盖风险和管理应急成本的基础上保证获得足够的利润。为了能够确定合理的提价比例,投标方需要观察其他竞争对手的投标策略,还要参考甲方或者委托代理机构的评标标准。一般来讲,每个投标方的报价都是在较为固定的投标策略下经过计算得出的。这样,如果一个投标方按照成本估计基础上加上提价比例的方式进行投标报价的话,那么可以通过观察他的历史投标报价数据总结其报价模式和提价比例策略。投标报价评标方法一般包括最低报价和平均值标价评标等,供应商也会根据评标方法调整标价策略。最低报价评标意味着评标机构按照各个投标方提供的价格从低到高进行排列,
一.存在意义考虑这样一个场景,identity函数接受一个参数,并原样返回:functionidentity(arg){ returnarg; }复制从类型上看,无论参数是什么类型,返回值的类型都与参数一致,借助重载机制,可以这样描述:functionidentity(arg:number):number; functionidentity(arg:string):string; functionidentity(arg:boolean):boolean; //...等无数个a=>a的类型描述复制重载似乎并不能满足这个场景,因为我们没有办法穷举arg的所有可能类型。既然参数是任意类型,不妨用any试试:functionidentity(arg:any):any;复制覆盖到了所有类型,却丢失了参数与返回值的类型对应关系(上面相当于A=>B的类型映射,而我们想要描述的是A=>A)泛型与any那么,应该如何表达两个any之间的对应关系呢?用泛型。这样描述:functionidentity<T>(arg:T):T{ returnarg; }复制类型变量T与any类
1、关于常用包java.long基础包:StringMathInteger...java.util工具包:CollectionMapDatejava.sql数据库相关:Conectionjava.io输入输出:OutputStreamFile2、JDK、JRE、JVMA的区别JDK:是java开发的工具箱,包含jre,还包含将java文件编译为class文件的javac工具类(编译器),除此之外还包括java原生的API;包含J2SE(标准版)、J2EE(企业版)、J2ME(用于移动设备)JRE:是java运行环境,所有的java程序都要在JRE下才能运行;包括JVMJVM:虚拟机,java运行依赖虚拟机,因为虚拟机所以才能跨平台3、&与&&区别&&具有短路的功能,即第一个表达式为false,则不再计算第二个表达式;&不管第一个正确与否都会计算第二个 4、char型变量能不能储存一个汉字char型变量是用来存储Unicode编码的字符的,unicode编码的字符集中包含汉字所以,char行变量中可以存储汉字。但是char不能存储unico
深度学习实战前面总结了吴恩达的深度学习课程笔记,博主把后续的深度学习课程笔记总结记录到个人博客里面,以供学习和交流使用。今天总结的是深度学习的超参数调试、正则化和梯度检验。改善神经网络依次通过数据集、偏差方差、正则化、梯度爆炸和消失来掌握深度学习的基础理论。数据集我们需要将数据集分为训练数据集(Traindataset)、验证数据集(Validation/Devdataset)和测试数据集(Testdataset),如下图所示: 训练数据集:训练模型时使用的数据集。 验证数据集:这个数据集主要在于当我们有多个模型时,我们需要选择最优的模型,验证数据集帮助我们挑选最优的模型算法(最优模型)。 测试数据集:测试数据集是用来评估模型准确度,主要是通过测试数据集对于挑选的最优模型进行无偏估计。 一般在机器学习早期,一般将数据集分为70%(traindataset)/30%(testdataset)or60%(traindataset)/20%(devdataset)/20%(testdataset),这主要是早期label数据量较少,这样划分是比较常用的数据划分。但是在现在的大数据时代,比如
1.1ConcurrentHashMap源码理解上篇,介绍了ConcurrentHashMap的结构。本节中,我们来从源码的角度出发,来看下ConcurrentHashMap原理。1.2ConcurrentHashMap初始化我们首先,来看下ConcurrentHashMap中的主要成员变量;publicclassConcurrentHashMap<K,V>{ //用于根据给定的key的hash值定位到一个Segment finalintsegmentMask; //用于根据给定的key的hash值定位到一个Segment finalintsegmentShift; //HashEntry[]初始容量:决定了HashEntry数组的初始容量和初始阀值大小 staticfinalintDEFAULT_INITIAL_CAPACITY=16; //Segment对象下HashEntry[]的初始加载因子: staticfinalfloatDEFAULT_LOAD_FACTOR=0.75f; //Segment对象下HashEntry[]最大容量: staticfina
在机器人中,执行机构一般分为液压驱动和电机驱动两种类型,其中又以电机驱动最为常见。本文主要讨论一般机器人驱动机构中电机的选择问题。 机器人中常用的电机分为有刷直流电机、无刷直流电机、永磁同步电机、步进电机等。其中在中小型机器人(尺寸在15cm-30cm)中,由于价格便宜,定位精度高,直流电机以及无刷直流电机最为常见。本文主要讨论直流电机的选择方法。 第一部分:电机要求 直流电机简介: 在市场上,存在着多种多样的直流电机。据不完全估计,单就国内就有上千家电机生产厂家。更不要提日本、德国等老牌电机生产强国。即使对于一个很小的直流电机,它都具有复杂的内部结构和大量的产品资料。这里,我们仅从机器人的角度出发考虑其对电机性能的要求。 电机的选择往往是我们对于电机性能的要求与我们可以接受价格的折衷。因而,在电机选择过程中,我们需要整体考虑电机的各个参数,从中筛选出对我们重要的参数,结合我们的需要,选择合适的电机。 对于一个电机来说,其往往具有多条运行特性曲线,这里我们将列出其中最重要的一些特性,然后对这些特性进行一些解释。对于一个电机,从机器人驱动的角度,我们主要的关心的有: a)工
0x00背景最近都在写反序列化漏洞的知识,本着循序渐进的过程,本篇研究到了反序列化与POPCHAIN相关的知识。在探索这方面知识的过程中,请教了许多师傅们并获得了相关案例和教科书般的文章,收获很多。今天斗哥就带着萌新们初探反序列化与POPCHAIN的相关知识。什么是POPCHAIN?这里给出我自己的理解:把魔术方法作为最开始的小组件,然后在魔术方法中调用其他函数(小组件),通过寻找相同名字的函数,再与类中的敏感函数和属性相关联,就是POPCHAIN。此时类中所有的敏感属性都属于可控的。当unserialize()传入的参数可控,便可以通过反序列化漏洞控制POPCHAIN达到利用特定漏洞的效果。0x01从基础的反序列化漏洞开始从一个基础的反序列化漏洞示例回顾下反序列化漏洞利用过程,如下代码使用了__destruct()魔术方法在执行完PHP程序后执行,执行后会删除网站临时文件夹/var/www/html/cache/tmp/下名为$cache_file;的文件。由于unserialize($_GET['data']);参数的值可控;满足了反序列化unserialize
用的是MUI的框架 <!DOCTYPEHTML> <html> <head> <metacharset="utf-8"/> <metaname="viewport"content="initial-scale=1.0,maximum-scale=1.0,user-scalable=no"/> <metaname="HandheldFriendly"content="true"/> <title>HelloH5+</title> <linkrel="stylesheet"href="../css/common.css"type="text/css"charset="utf-8"/> <scripttype="text/javascript"src="../js/common.js"></script> <scripttype="text/javascript"> varpays={}; functionplusReady(){ plus.pay
来源:https://juejin.im/post/5915c0a744d904006c4e3bcd demo下载地址:https://github.com/xiehui999/KotlinForAndroid 写在前面 在之前的一篇文章,我们简单的知道了Kotlin这门新语言的优势,也接触了一些常见的语法及其简单的使用,相信你会对它有浓厚的兴趣,暂且理解为对它感兴趣吧,哈哈哈。那么,我们该如何在Android中应用这门新的语言呢?今天的这篇文章带你学习使用Kotlin开发Android应用,并对比我们传统语言Java,让你真真切切的感受到他的美和优雅。 配置 项目gradle文件 applyplugin:'com.android.application'applyplugin:'kotlin-android'applyplugin:'kotlin-android-extensions'dependencies{ classpath'org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.1'}复制
我是一名计算机专业的本科生,2016年7月到12月期间,参加专业技能培训学习。在此期间接触一些其他高校的学生,我和他们接触期间,结合实际情况,有以下感想: 1、在大学期间,要努力学习课程知识,打牢基础。 也许,你会觉得大学安排的有些课程枯燥无味或很难懂,再或者你觉得这个科目没用,不愿意学,但是当我在培训学习期间,感觉自己基础不扎实·······换句话说,大学所学的东西也许工作真的用不到,但是你用到的专业知识的的确确建立在大学所学的基础知识上。如果你的基础知识不牢,即使参加培训你也会感觉压力很大,甚至感觉跟不上,最后学无所成。 2、要有自己的一技之长。 也许有人会问,(计算机专业类的)大学生上了几年大学,还要去培训才能找到工作吗?这个问题其实尴尬,也很无奈,无论是对学校还是大学生来说。 我作为一个本科生在校,所学的课程的可谓是博而广,涉及到很多行业,学校本着让所有的学生尽可能多的学到不同的知识,为将来就业提供更宽广的选择平台。 等到即将毕业找工作的时候,发现自己貌似很多东西都知道一点,结果现实是自己是什么也做不了。 我是在自己所学过的专业知识中,找自己喜欢并结合社会实际情况
1、当初你是如何做出选择计算机专业的决定的? 经过一年学习,你的看法改变了么,为什么?你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗?为什么? 时间若白驹过隙,一年时间悄悄地过去了。在这一年中,经历了很多。我想,如果回到当初选专业的时候,我还是会做同样的选择。回想当初选择专业时,我更看重的是计算机专业的前景。在高三结束的暑假,自学了C语言。无论是初次接触编程的兴奋,还是打出一道又一道题目的自豪感,都使我对编程产生了极大的兴趣。我也渐渐地发现,计算机专业是一个极具创造性的专业,而这就是我想要学习的。我觉得擅长或不擅长,这决定于是否有动手去敲代码以及是否喜欢自己用代码写一些东西。首先,孰能生巧。在大一上学期对C的学习,代码量要远远高于下学期对数据结构的学习,所以就结果而言,c语言学得比数据结构好更好一些。其次,有兴趣才能学得更好,去网上找一些更“骚”的操作,然后学会运用它们;又或者自己学着去写一些小游戏、爬虫之类的,都会让你对这个专业更加喜欢。总而言之,对计算机领域我说不上擅长,毕竟处处有大佬,同志仍需努力。但是,计算机确实是我喜欢的领域。 2.对比开篇博客,哪些方面还存在哪些不足?
http://www.lydsy.com/JudgeOnline/problem.php?id=2821 分块 我们把数列分成$\sqrt{N}$块 记$f[i][j]$表示第i块到第j块的答案,这个可以在$O(N\sqrt{N})$内得到。 记$g[i][j]$第1到第i块中数字j出现了多少次,这个我们可以先求出第i块中数字j出现了多少次,然后求前缀和即可,这个可以在$O(C\sqrt{N})$内得到。 对于询问区间[l,r]我们可以从f数组中快速求出中间连续的完整的块答案。 对于剩余部分,我们可以一个一个调整答案,反正剩余部分的长度是$\sqrt{N}$级别的。 #include<cstdio> #include<cstdlib> #include<iostream> #include<fstream> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<queue>
学习Python3,坚持每一次学习都有一点点知识的积累,瞄准目标gogogo! 由于之前参加了6月底的PMP考试,导致Python3的学习中断了,最近又想趁热打铁把高项拿下,高项的考试比PMP要麻烦得多,学习也是断断续续的。 此次是一个简单的爬取加密数据的爬虫,主要是用到了如下组件(此事就提现到了python的优势,各种组件一键安装,强大、方便、好用): request 网络请求 execjs 在python中完成JavaScript代码的运行 (由于涉及到SM4的加密,所以在获取到目标网站的加密js之后,想要准确执行还是建议直接把相关代码copy下来,直接执行,免去换语言翻译以及存在误差的问题) 网站爬取要求: 发送的数据请求body要先加密 header中有若干要求,Cookie在header中 返回的数据请求要解密 不说废话,代码(残缺,涉及到目标网站的机密): 加密模块(网站的请求内容,也是需要加密的): #coding=utf-8 importexecjs importjson fromurllibimportparse jscompile=exe
✅求装满背包的物品的排列总和 这里是求排列,而不是组合!!!即是[1,2],[2,1]是两个东西 ?在背包问题里求排列的方法是: 排列:先遍历背包容量,再遍历物品 组合:先遍历物品,再遍历背包容量 这里再注意到这里是完全背包,再遍历背包容量的时候正序就好了 classSolution{ public: intcombinationSum4(vector<int>&nums,inttarget){ vector<int>dp(target+1,0); dp[0]=1; for(intj=0;j<=target;j++){ for(inti=0;i<nums.size();i++){ if(j>=nums[i]&&dp[j]<INT_MAX-dp[j-nums[i]]) dp[j]+=dp[j-nums[i]]; } } returndp[target]; } }; 复制
超现实树(Surreal) 时隔10个月,我又来复盘此题啦/se 当时蒟蒻不会这道题,胡了个三树合并的做法,以为GG但发现竟然还有40pts/jy 什么是三棵树合并?一个简单的例子: 这是第2组样例。它的答案为AlmostComplete。对于更复杂的树,如果其它部分完全一样,三棵树分别是如上的结构,那么可以合并到一块,例如 如果能合并成像右边一样是一个只包含根节点的树,它就是AlmostComplete,否则就是No。 于是你开始信心满满地开始rush一份线性的带Hash的代码,当你开始一组组地跑样例时,发现Case5WA了! 如果出题人按照开始只下发前4组样例,估计大多数错解选手就会跑路看T1或T3,还好他是Almost良心的(bushi),补发了两组! 此时要反思为什么上面是错的。在第一幅图中: \({\rmgrow}(\)\()+{\rmgrow}(\)\()+{\rmgrow}(\)\()={\rmgrow}(\)\()\setminus\{\)\(\}\ne{\rmgrow}(\)\()\) 发现两者不完全等价!我们尝试修正该方法。我们使用红色的节点来特殊化被合并的