Drools 规则引擎原理

news2024/11/28 7:41:28

目录

  • Drools规则引擎
    • 基本定义
    • 介绍
    • 优劣
      • 优点
      • 缺点
    • 基本概念
      • 规则引擎构成
    • 规则结构
    • 规则引擎执行过程
    • 规则存储
    • Kie 介绍
      • Kie 相关组件
      • 知识库
      • 规则引擎与知识库
      • Drools 存储规则的数据结构
  • Rete 算法
    • 原理
    • 优缺点
      • 优点
      • 缺点
    • 举例
  • 前向和后向链推理机制
    • 前向链
    • 后向链
    • 对比
  • 应用场景
    • 概念和特点
    • 架构和组件
    • 使用方法和示例
  • 相关文献资料

基于Java的开源的规则引擎框架有很多,从实现原理上来说分为以下三类:

  1. 通过Java语言+RETE算法实现(drools和urule)
  2. 通过脚本语言+jvm实现(groovy)
  3. 通过Java表达式+jvm实现(Aviator)

Drools规则引擎

基本定义

从“频繁且通用”的业务变化中抽象出来的中间服务层,实现了将决策逻辑从应用代码中分离出来,并使用预定义的高级语法或者可视化的工具编写业务规则并自动优化执行。

规则引擎具体执行可以分为接受数据输入,高效解释业务规则,根据业务规则输出决策结果几个过程。如下图所示:
在这里插入图片描述

介绍

Drools规则引擎是一种基于规则的方法,用于在Drools软件中实现专家系统。规则引擎提供了专家系统,这是一种基于知识的系统,可以帮助你做出决策,比如做什么和怎么做。它将知识收集到一个知识库中,可以用于推理。

Drools规则引擎基于以下抽象组件实现:

  • 规则(Rules):业务规则或DMN决策。所有规则必须至少包含触发该规则的条件以及对应的操作。
  • 事实(Facts):输入到规则引擎的数据,用于规则的条件的匹配。
  • 生产内存(Production memory):规则引擎中规则存储的地方
  • 工作内存(Working memory):规则引擎中Fact对象存储的地方。
  • 议程(Agenda):用于存储被激活的规则的分类和排序的地方。

Drools规则引擎的核心组件有:
• KieFileSystem:一个内存文件系统,用于存储规则文件和其他资源。
• KieContainer:一个包含多个KieBases的容器,每个KieBase代表一个知识库。
• KieSession:一个用于插入事实和触发规则的会话。
• Rule:一个表示单个规则的对象,它包含匹配事实的条件和执行动作的结果。
• Fact:一个表示输入数据的对象,它可以被规则引擎修改、插入或删除。

优劣

优点

  1. 声明式编程:规则引擎允许你说“做什么”,而不是“怎么做”。这样可以使得表达复杂问题的解决方案更容易,并且可以验证解决方案的正确性。规则比代码更容易阅读。
  2. 业务逻辑的集中管理:规则引擎可以将业务逻辑从程序代码中分离出来,使得业务逻辑的维护和变更更快更便宜。同时,也可以缩小业务人员和技术人员之间的沟通鸿沟,因为规则可以用一种容易理解的格式编写。
  3. 规则的复用和组合:规则引擎可以将规则分为不同的模块,根据不同的场景和需求进行复用和组合。这样可以提高规则的可扩展性和灵活性。

缺点

  1. 学习成本:开发人员需要学习一种新的编程方式,掌握规则引擎的基本概念和语法。同时,也需要了解规则引擎的内部工作原理,以便优化规则的性能和效率。
  2. 调试困难:规则引擎的运行过程可能涉及到大量的规则匹配和推理,当出现错误或异常时,很难定位问题的原因和位置。此外,规则之间也可能存在冲突或循环,需要注意避免或解决。
  3. 不适合简单或稳定的业务逻辑:如果一个应用中只有很少或没有变化的业务逻辑,使用规则引擎可能是一种过度设计,会增加不必要的复杂度和开销。在这种情况下,直接使用程序代码可能更合适。

基本概念

规则引擎(RE)是一种模块,可以自动化管理一些高度可变的过程。基本的概念是将参与过程的对象与实现这些过程的逻辑分离。逻辑是通过编写规则来定义的。

Drools规则引擎使用开源的Drools规则引擎,它使用了一种改进的Rete算法,并具有前向和后向链推理机制。

Fact:事实,是指在drools规则应用当中,将一个普通的Java Bean插入到Working Memory后的对象就是Fact对象。

规则引擎构成

由以下三部分组成:

  1. Working Memory(工作内存):规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,应用程序需要将数据插入到Working Memory中。
  2. Rule Base(规则库):在规则文件中定义的规则都会被加载到规则库中。
  3. Inference Engine(推理引擎)

其中Inference Engine(推理引擎)又包括:

  • Patter Matcher(匹配器):将Rule Base中所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活放入Agenda。
  • Agenda(议程):用于存放通过匹配器进行模式匹配后被激活的规则。
  • Execution Engine(执行引擎)
    在这里插入图片描述

规则结构

Drools规则引擎有自己的语法来编写规则,这种语法是声明式、简洁和明确的。一个规则有以下结构:

  • when 条件
    条件是根据一定的语法规则来编辑的。根据这种语法,设置一个条件意味着验证一个事实。应用规则的上下文由一组事实组成,这些事实描述了RE操作的当前情况,并被断言在一个工作内存中。为了判断是否应用一个规则,RE验证一个事实是否在工作内存中被有效地断言。如果是,那么规则就被应用。
  • then 动作
    动作区域是用普通的Java代码来编辑的,包含了如果条件被验证要执行的动作。要应用的规则被包含在一个生产内存中。RE比较生产内存中假设的动作和工作内存中断言的事实。如果有兼容性,RE执行一个或多个规则。

简单来说,Drools规则就是根据when后的条件来匹配工作内存中的事实,如果匹配成功,就执行then后的动作。

规则引擎执行过程

  1. 将初始数据(fact)输入至工作内存(Working Memory);
  2. 使用Pattern Matcher将规则库中的规则(rule)和数据(fact)比较;
  3. 如果执行规则存在冲突(confict),即同时激活了多个规则,将冲突的规则放入冲突集合;
  4. 解决冲突,将激活的规则按顺序放入Agenda;
  5. 执行Agenda中的规则。重复步骤2至5,指导执行完毕Agenda中的所有规则。

规则存储

Drools规则引擎使用一个知识库(Knowledge Base)来存储规则,知识库是Drools生态系统中的知识的代表,它包含了规则所在的资源的信息,也可以创建知识会话。

知识库可以分为不同的模块(Module),每个模块可以包含多个知识库,每个知识库可以包含不同的会话。

规则可以以.drl文件或Excel表格的形式编写,也可以通过Java配置或注解来定义。

规则可以通过KieFileSystem来写入一个内存文件系统,也可以通过ResourceFactory来从类路径或其他位置读取。

规则可以通过KieContainer来管理和加载,KieContainer是一个包含多个KieBases的容器,每个KieBase代表一个知识库。

Kie 介绍

在这里插入图片描述

Kie 相关组件

在这里插入图片描述
Drools是Kie中的一个组件。

知识库

知识库(Knowledge Base)是一种存储和组织知识的方式,它可以包含不同类型和格式的数据,例如文本、图像、视频、音频等。知识库的结构通常取决于知识的领域、用途和特点,但一般来说,它由以下几种基本数据结构组成或者与之相关:

  • 实体(Entity):知识库中的基本单元,代表一个具体或抽象的事物,例如人、地点、事件、概念等。实体通常有一个唯一的标识符和一些属性(Attribute),用来描述实体的特征,例如姓名、年龄、颜色等。
  • 关系(Relation):知识库中描述实体之间的联系的方式,例如父子、属于、发生在等。关系通常有一个类型和一些约束条件,用来规定关系的适用范围和方向,例如亲属关系只能在人类实体之间存在,且是双向的。
  • 三元组(Triple):知识库中表示一个事实的最小单位,由一个主体实体(Subject)、一个关系(Predicate)和一个宾语实体(Object)组成,例如(北京,首都,中国)、(爱因斯坦,出生于,德国)。三元组可以看作是知识库中的语句或断言,用来表达知识的内容。
  • 本体(Ontology):知识库中定义实体和关系的类别和层次结构的方式,例如人类是动物的子类,父子是亲属关系的一种。本体可以看作是知识库中的语法或规则,用来约束和指导知识的表示和推理。
  • 图(Graph):知识库中将实体和关系视为节点和边的网络结构,例如实体-关系图(ER图)、语义网(Semantic Web)。图可以看作是知识库中的数据模型或视图,用来存储和展示知识的结构和关联。

规则引擎与知识库

对于一个规则引擎来说,它可以看作是一种特殊的知识库,它的结构主要由以下几个部分组成:

  • 规则(Rule):规则引擎中的基本单元,代表一个业务逻辑或决策,一般表示为IF-THEN的形式,例如IF(年龄>18)THEN(成年)。规则通常由条件(Condition)和动作(Action)组成,条件用来判断是否满足规则,动作用来执行规则的结果。
  • 事实(Fact):规则引擎中的输入数据,代表一个具体或抽象的事物,例如人、订单、事件等。事实通常有一些属性(Attribute),用来描述事实的特征,例如姓名、价格、状态等。
  • 模式匹配器(Pattern Matcher):规则引擎中的核心组件,负责将规则和事实进行比较,找出符合条件的规则,并将它们放入冲突集合(Conflict Set)中。
  • 冲突解决器(Conflict Resolver):规则引擎中的核心组件,负责从冲突集合中选择一个或多个要执行的规则,并将它们放入议程(Agenda)中。
  • 执行器(Executor):规则引擎中的核心组件,负责从议程中取出要执行的规则,并执行它们的动作,同时更新工作内存(Working Memory)中的事实。

知识库中的模块和会话的含义可能因不同的系统而有所不同,但一般来说,模块是指知识库中的一个子集,包含了某个特定领域或主题的相关知识。会话是指用户与知识库之间的一次或多次交互,用于查询、更新或探索知识。模块和会话的作用是帮助用户更有效地获取和利用知识,以及提高知识库的可扩展性和可维护性。

Drools 存储规则的数据结构

  • KieBase:一个知识库,它包含了一组编译后的规则、流程和类型声明,以及相关的配置和环境信息。KieBase是线程安全的,可以在多个KieSession中共享。KieSession是一个运行时的状态容器,它包含了工作内存、模式匹配器、冲突解决器和执行器等组件,用来执行规则和流程。KieSession是从KieBase中创建的,可以有多个KieSession与同一个KieBase关联。
  • KieModule:一个包含了多个KieBase和KieSession的配置信息的容器,可以是一个jar文件或者一个文件夹。KieModule可以从本地或者远程的Maven仓库中加载。
  • KieFileSystem:一个虚拟的文件系统,用来存储规则文件和其他资源文件,可以通过KieBuilder将其编译为KieModule。
  • KieContainer:一个管理KieModule的容器,可以从本地或者远程的Maven仓库中加载KieModule,并且可以动态地更新KieModule。
  • KieSession:一个运行时的状态容器,用来执行规则和流程,可以从KieBase中创建。KieSession有两种类型:Stateful和Stateless。Stateful KieSession会保留工作内存中的数据,需要手动释放资源;Stateless KieSession不会保留工作内存中的数据,每次执行完毕后会自动释放资源。

Rete 算法

Rete 是一种进行大量模式集合和大量对象集合间比较的高效方法,通过网络筛选的方法找出所有匹配各个模式的对象和规则。 其核心思想是用分离的匹配项构造匹配网络,同时缓存中间结果。以空间换时间。规则编译(rule compilation)和运行时执行(runtime execution)。

Rete算法是一种用于实现规则引擎的高效模式匹配算法,它可以快速地找出满足一组规则的数据集合(zhuanlan.zhihu.com)。

原理

  1. 将规则的条件部分(LHS)转换为一个网络结构,称为Rete网络,其中包含了不同类型的节点,如alpha节点、beta节点、join节点和terminal节点。
  2. 将数据(facts)输入到Rete网络的根节点,沿着网络流动,经过不同的节点进行过滤、合并和检测,最终到达terminal节点,表示匹配了某个规则的结果部分(RHS)。
  3. 在每个节点中,维护一个内存区域,用于存储通过该节点的数据或数据组合,以避免重复计算和提高效率。
  4. 在每次数据或规则发生变化时,更新Rete网络中的内存区域,并重新触发匹配过程。

Rete算法的用途是提高规则引擎的性能和可扩展性,使其能够处理大量的数据和规则,以及动态地适应数据和规则的变化。

Drools规则引擎提供了一系列的API和工具来创建、编译、加载和执行规则,以及管理Rete网络中的数据和状态。

优缺点

优点

  • Rete算法可以快速地找出满足一组规则的数据集合,避免了重复计算和遍历,提高了规则引擎的性能和可扩展性(jianshu.com)(blog.csdn.net)。
  • Rete算法的匹配速度与规则数目无关,只与数据的数量和复杂度有关(blog.csdn.net)。
  • Rete算法可以动态地适应数据和规则的变化,实现了数据驱动的推理过程(jianshu.com)(blog.csdn.net)。

缺点

  • Rete算法需要维护一个复杂的网络结构和大量的内存空间,消耗了系统的资源(jianshu.com)(blog.csdn.net)。
  • Rete算法对数据的删除和修改操作比较困难,需要执行额外的查找和更新(blog.csdn.net)。
  • Rete算法对于一些简单或者不经常变化的规则,可能没有必要使用,反而增加了系统的开销(jianshu.com)(blog.csdn.net)。

举例

假设我们有以下三条规则:

  1. 如果一个人的年龄大于18岁,那么他是成年人。
  2. 如果一个人的性别是男,那么他是男性。
  3. 如果一个人是成年人并且是男性,那么他可以参军。

我们可以用Rete算法来构建一个网络来匹配这些规则。网络的结构如下:https://i.imgur.com/0fZw7Qg.png

网络中有以下几种节点:

  1. Root node:网络的入口,接收所有的数据(facts)。
  2. Object type node:根据数据的类型进行过滤,只传递符合类型的数据到下一层节点。
  3. Alpha node:根据数据的属性进行过滤,只传递符合条件的数据到下一层节点。
  4. Beta node:根据两个输入数据的关系进行过滤,只传递符合条件的数据组合(token)到下一层节点。
  5. Terminal node:网络的出口,表示匹配了某条规则的结果。

每个节点都有一个内存区域,用于存储通过该节点的数据或数据组合。当数据或规则发生变化时,网络中的内存区域会相应地更新,并重新触发匹配过程。

假设我们有以下三个数据:

  • {name: “Tom”, age: 20, gender: “male”}
  • {name: “Alice”, age: 17, gender: “female”}
  • {name: “Bob”, age: 19, gender: “male”}

当这些数据输入到网络中时,会经历以下过程:

  • 数据从root node进入网络,然后根据类型被分发到对应的object type node。因为这里所有的数据都是Person类型,所以都会被传递到Person object type node。
  • 数据从Person object type node进入到alpha node,然后根据属性被分发到对应的alpha node。例如,Tom会被传递到age > 18和gender == "male"两个alpha node,Alice会被传递到age <= 18和gender == "female"两个alpha node,Bob会被传递到age > 18和gender == "male"两个alpha node。
  • 数据从alpha node进入到beta node,然后根据两个输入数据的关系被分发到对应的beta node。例如,Tom和Bob会被传递到age > 18 && gender == "male"这个beta node,Alice不会被传递到任何beta node。
  • 数据从beta node进入到terminal node,然后表示匹配了某条规则的结果。例如,Tom和Bob会被传递到rule 3这个terminal node,表示他们可以参军。Alice不会被传递到任何terminal node。

这就是一个简单的Rete算法的例子。你可以看到,Rete算法通过构建一个网络来高效地匹配大量的规则和数据,并且可以动态地适应变化。

前向和后向链推理机制

前向链和后向链是两种不同的推理机制,它们在Drools中发挥着不同的作用。

前向链

前向链是一种从已知事实和规则出发,推导出新的事实和结论的过程。它是一种数据驱动的方法,适用于需要处理大量数据并触发相应规则的场景。前向链是Drools的默认推理机制,它通过构建一个Rete网络来高效地匹配规则和数据。

后向链

后向链是一种从目标或假设出发,通过回溯一系列事实和规则来验证其真伪的过程(baeldung.cc)。它是一种目标驱动的方法,适用于需要根据特定目标来查询数据的场景(baeldung.cc)。后向链是Drools从5.2.0版本开始支持的推理机制,它通过定义查询来实现后向链。

对比

  • 适用场景:前向链适用于需要处理大量数据并触发相应规则的场景,例如欺诈检测、风险评估、推荐系统等。后向链适用于需要根据特定目标来查询数据的场景,例如诊断系统、智能问答、规划系统等。
  • 推理效率:前向链的推理效率取决于数据的数量和规则的复杂度,如果数据量很大或规则很多,可能会导致推理过程缓慢或占用大量内存。后向链的推理效率取决于目标的难度和规则的相关性,如果目标很难或规则很少,可能会导致推理过程失败或无法找到答案。
  • 推理方式:前向链是一种自下而上的推理方式,它从已知事实出发,不断地生成新的事实和结论,直到满足某个条件或达到某个限制。后向链是一种自上而下的推理方式,它从目标或假设出发,不断地寻找支持或反驳它的事实和规则,直到证明其真伪或无法继续。
  • 推理结果:前向链的推理结果是一组满足规则条件的事实和结论,它们可能有多个或没有。后向链的推理结果是一个确定的答案,它是对目标或假设的真假判断,它只有一个或不存在。
    总之,前向链和后向链在Drools中分别提供了不同的推理能力,可以根据不同的业务需求来选择合适的推理机制。

应用场景

Drools规则引擎的应用场景有:

  1. 业务决策:规则引擎可以用于处理复杂的业务逻辑,如信用评分、保险核保、贷款审批等,根据不同的事实和规则,产生自动化的决策(https://www.baeldung.com/drools)。
  2. 复杂事件处理:规则引擎可以用于处理实时的事件流,如股票交易、网络监控、传感器数据等,根据不同的事件和规则,触发相应的动作或警报(https://www.drools.org/)。
  3. 工作流程:规则引擎可以用于定义和执行业务流程,如订单处理、发票管理、人事审批等,根据不同的任务和规则,控制流程的走向和状态https://www.drools.org/。
  4. 讲解学习

概念和特点

Drools是一个基于Java的开源业务规则管理系统(BRMS),它提供了一个核心的业务规则引擎(BRE),可以用简单易懂的规则语言来描述业务逻辑,并将业务逻辑和数据对象分离,实现业务逻辑的灵活变更和复用。

架构和组件

Drools规则引擎由以下几个主要组件构成:规则文件(.drl)、知识库(KieBase)、会话(KieSession)、工作内存(Working Memory)、议程(Agenda)、推理机(Inference Engine)和规则流(Rule Flow)。

使用方法和示例

Drools规则引擎的使用方法主要包括以下几个步骤:

  1. 创建规则文件,定义规则的名称、属性、条件和动作;
  2. 创建知识库,加载规则文件并编译为字节码;
  3. 创建会话,从知识库中获取会话对象;
  4. 插入事实,将业务数据插入到工作内存中;
  5. 执行规则,触发推理机根据事实和规则进行匹配和执行;
  6. 处理结果,获取规则执行的结果并进行相应的处理。

相关文献资料

  • Putting BPMN and DMN to Work: a Pediatric Surgery Case Study(https://www.drools.org/community/research.html):这篇论文介绍了如何使用Drools Workbench来建模和执行儿科手术的业务流程和决策,展示了Drools的实际应用效果。
  • Modeling surgical pediatric processes with BPMN and DMN(https://link.springer.com/chapter/10.1007/978-3-030-43306-2_34):这篇论文是上一篇论文的毕业论文版本,更详细地描述了使用Drools Workbench的方法和步骤,以及遇到的挑战和解决方案。
  • Semi-automatic Composition of Geospatial Web Services Using JBoss Rules:这篇论文探讨了如何使用Drools来实现地理空间Web服务的半自动组合,提出了一种基于规则的服务匹配和选择算法,以及一种基于规则的服务组合框架。
  • Application Research of Business Rules Engine Management System Based on Drools:这篇论文介绍了基于Drools的业务规则引擎管理系统的设计,包括规则文件的可视化封装、业务对象和参数对象的抽象配置、规则生命周期的管理等。
  • Drools rules engine(https://www.ibm.com/docs/en/sig-and-i/5.2.5?topic=engine-drools-rules):这篇文档介绍了Drools规则引擎的基本概念和架构,包括事实、工作内存、规则、知识库、知识会话等,以及如何使用Java配置和注解来创建和执行规则。
  • Introduction to Drools(https://www.baeldung.com/drools):这篇文章也介绍了Drools规则引擎的基本概念和架构,以及如何使用Maven依赖和Spring Boot来创建和执行规则。

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

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

相关文章

MMPretrain

title: mmpretrain实战 date: 2023-06-07 16:04:01 tags: [image classification,mmlab] mmpretrain实战 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccTl9bOl-1686129437336)(null)] 主要讲解了安装,还有使用教程.安装教程直接参考官网.下面讲…

【mmpose】从openmmlab官方文档看mmpose架构设计,模块组成,快速上手实现关键点检测效果(动物,人体,手部等)

MMPOSE 架构设计 MMPose 1.0 与之前的版本有较大改动&#xff0c;对部分模块进行了重新设计和组织&#xff0c;降低代码冗余度&#xff0c;提升运行效率&#xff0c;降低学习难度。使用 MMPose 1.0 时开发者会关心的内容&#xff1a; 整体代码架构与设计逻辑&#xff1b; 如何…

告别加班!9款Figma汉化插件助你高效工作,提升生产力!

Figma是一款极受设计师欢迎的设计工具&#xff0c;而Figma中文版即时设计则是在Figma基础上改进而来&#xff0c;有着众多的Figma汉化插件&#xff0c;可以加速设计工作&#xff0c;让每位设计师完成更好的创作。 打开即时设计官网首页&#xff0c;点击【设计社区】-【插件广场…

虚函数表详解及其应用场景

目录 概述1. 虚函数表概述2. 虚函数表的实现原理2.1. 虚函数的声明和定义2.2. 虚函数表的创建和初始化2.3. 虚函数调用的过程 3. 虚函数表的应用场景3.1. 多态性3.2. 基类指针和引用的使用3.3. 动态绑定3.4. 接口定义 结论 概述 在面向对象编程中&#xff0c;虚函数表&#xf…

java-JDBC

java-JDBC 1. JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 sun公司就指定了一套标准接口&#xff08;JDBC&#xff09;&#xff0c;JDBC中定义了所有操作关系型数据库的规则。 我们需要使用接口…

人群聚集监测预警算法 python

人群聚集监测预警系统采用pythonopencv网络模型AI视频智能分析技术&#xff0c;人群聚集监测预警算法对人员聚集情况进行实时监测&#xff0c;当人群聚集过于密集时&#xff0c;系统将自动发出警报。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的接口。Ope…

R语言 tidyverse系列学习笔记(系列1)

tidyverse 译 “洁净的宇宙” > “极乐净土” 以 iris 鸢尾花数据集为例 ** 查看数据集** ** 查看维度dimention** dim(iris)iris 数据集有150个对象&#xff08;observation&#xff09;&#xff0c;5列 ( Sepal.Length , Sepal.Width , Petal.Length , Petal.Width , S…

阿里服务器配置服务器自启动

一开始 是在 /etc/rc.local 文件中添加的如下脚本 bash /mnt/cangjie-server/action.sh start bash /usr/local/nginx/sbin/nginx pm2 start npm--name"cangjieWeb"run start 启动服务器&#xff0c;服务并没有执行。 后面把执行脚本的 bash 指令去掉 如下&#xf…

Linux内核中断和Linux内核定时器

目录 Linux内核中断 Linux内核定时器 Linux内核中断 int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev) 功能&#xff1a;注册中断 参数&#xff1a; irq : 软中断号 gpio的软中断号 软中断号 gpio_to_i…

期末复习样卷

期末复习样卷 目录 期末复习样卷选择题简答题1. 画E-R图并将其转换为适当的关系模型2. 规范化模式分解——教学关系&#xff08;学号&#xff0c;姓名&#xff0c;年龄&#xff0c;性别&#xff0c;系别&#xff0c;系主任&#xff0c;课程名&#xff0c;成绩&#xff09;3.关系…

重装Windows系统

1.前言 有的时候&#xff0c;面对杂乱的文件系统&#xff0c;整理是十分困难的…… 有的时候&#xff0c;下载软件的时候会附带上某一些病毒、木马…… 有的时候&#xff0c;不满于更新后的系统…… 这些种种都可以使用重装系统解决&#xff0c;接下来我来带您学习重装windows…

煤炭价格学习

大佬发表时间在2022.11.17 神华月线&#xff0c;因为没有送配股&#xff0c;所以肯定是除权看的&#xff08;前复权看的不要跟我谈技术&#xff0c;因为你不配&#xff09; 除权&#xff0c;前复权&#xff0c;后复权 理解这三者区别之前&#xff0c;首先我们要简单了解 除权和…

【String字符串之后续】

我们继续上一篇文章为大家讲解&#xff0c;String字符串的相关知识&#xff0c;希望大家有所收获&#x1f49e;&#x1f49e;&#x1f49e; 字符串前篇的链接: link 目录 1.字符串的替换2.字符串的拆分3.字符串截取4.去掉空格5.String的不可变性6. 字符串的修改7.StringBuilde…

STL:string类使用

编码&#xff1a; ASCII unicode–utf-8 utf-16----一个字符2个字符 utf-32----一个字符4个字节 gbk–中文编码表 string&#xff1a; 是一个特殊的容器&#xff0c;对数据&#xff08;字符数组&#xff09;和库函数&#xff08;strlen等&#xff09;进行封装 STL提供的内容…

OpenStack部署(三)

OpenStack部署 6. Neutron6.1 创建Neutron数据库并授权6.2 获得admin凭证6.3 创建 neutron 用户并设置密码6.4 添加admin角色到neutron 用户6.5 创建neutron服务实体6.6 创建网络服务API端点6.7 安装并配置neutron服务6.8 链接plugin.ini文件6.9 初始化neutron数据库6.10 重启计…

连续两年!PingCAP 入选 Gartner 云数据库“客户之声”,获评“卓越表现者”最高分

近日&#xff0c;全球权威信息技术研究与咨询机构 Gartner 发布了云数据库市场领域 2023 Gartner Peer Insights™“Voice of the Customer” 报告&#xff0c;PingCAP 在报告中获得的客户总体评分达到 4.9 分&#xff08;满分 5 分&#xff09;&#xff0c;在所有入选企业中位…

CBCGPCaptionBar 使用实例说明

CBCGPCaptionBar的位置如下&#xff1a; 如图区域就是 MainFrame.h中声明&#xff1a; CBCGPCaptionBar m_wndCaptionBar; MainFrame.cpp中创建显示控件&#xff1a; BOOL CMainFrame::CreateCaptionBar () { if (!m_wndCaptionBar.Create (WS_CHILD | WS_V…

力扣第三天 242.有效字母异位词 349 两个数组的交集

目录 1.242. 有效的字母异位词 2.349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09;​​​​​​ 使用算法笔记&#xff1a; 总结&#xff1a; 1.242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意…

15. 算法之排序算法

前言 排序是在软件开发中经常遇到的需求。比如基于订单的创建时间倒排&#xff0c;基于金额大小排序等等&#xff0c;那么这些排序底层是怎么写的呢&#xff0c;本节&#xff0c;我们就常用排序算法展开介绍。 1. 冒泡排序 1.1 算法思想 冒泡排序是最基础的排序算法。冒泡排…

HashMap 的底层原理和源码分析

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; 文章目录 一、HashMap…