最新常见的图数据库对比,选型,架构,性能对比

图数据库排名

  • 地址:https://db-engines.com/en/ranking/graph+dbms

知识图谱查询语言

SPARQL、Cypher、Gremlin、PGQL 和 G-CORE

语法 / 语义 / 特性SPARQLCypherGremlinPGQLG-CORE
图模式匹配查询语法CGPCGPCGP(无可选)1CGPCGP
语义子图同态、包 2无重复边、包 2子图同态、包 2子图同构 3、包 2子图同态、包 2
导航式查询语法RPQ 超集 (增加反向边和属性集上的否定)RPQ 子集 (* 只能作用在单边)RPQ 超集 (增加通过表达式比较属性值)RPQ 超集 (增加比较路径上的顶点和边)RPQ 超集 (增加复杂路径表达式)
语义任意路径、集合 4无重复边 5、包 2任意路径 6、包 2最短路径 7、包 8最短路径 9、包 2
分析型查询聚合函数聚合函数聚合函数、PageRank、PeerPressure 聚类聚合函数聚合函数
查询可组合性
数据更新语言 DMLCRUD10CRUDCR
数据定义语言 DDL
实现系统Jena、RDF4J、gStore、Virtuoso 等Neo4j、AgensGraph 等TinkerTop 等Oracle PGX

  1. Gremlin 不显式支持可选 (optional) 操作, 但可以通过其他语法特性等价模拟.

  2. 可通过 DISTINCT 关键字支持集合语义.

  3. PGQL 默认的图模式匹配查询语义是子图同构, 可使用 ALL 关键字改为子图同态.

  4. SPARQL 中只有当使用 * 运算使得属性路径查询无法等价写为 CGP 时才使用集合语义.

  5. Cypher 可通过 shortestPath 函数支持最短路径语义.

  6. Gremlin 中其他语义可以被模拟出来.

  7. PGQL 路径查询可通过用户定义函数实现其他语义.

  8. PGQL 路径查询返回单条最短路径, 集合和包语义相同.

  9. G-CORE 路径查询可通过 ALL 关键字改为任意路径语义.

  10. CRUD 分别代表 CREATE 创建、READ 读取、UPDATE 更新和 DELETE 删除

知识图谱存储方式

  • 关系型存储

存储大规模知识图谱,且便于对知识进行更新,但当知识图谱查询的选择性较大时,查询性能明显下降

  • 原生图存储

无邻接索引的特性能够高效处理复杂的知识图谱查询,但有限的存储容量和不灵活的更新机制使得原生图存储不能很好地应用于大规模知识图谱中

基于关系的知识图谱存储管理

关系数据库目前仍是使用最多的数据库管理系统。基于关系的知识图谱存储方案, 包括: 三元组表、水平表、属性表、垂直划分、六重索引和 DB2RDF。

三元组表

三元组表 (triple table) 是将知识图谱存储到关系数据库的最简单、最直接的办法, 就是在关系数据库中建立 一张具有 3 列的表, 该表的模式为 triple_table(subject,predicate,object),subject、predicate 和 object 这 3 列分别表示主语、谓语和宾语。

  • 三元组表存储方案虽然简单明了,但三元组表的行数与知识图谱的边数相等,其最大问题在于将知识图谱查询翻译为 SQL 查询后会产生三元组表的大量自连接操作

  • RDF 数据库系统 3store

水平表

水平表 (horizontal table) 存储方案同样非常简单。水平表的每行记录存储知识图谱中一个主语的所有谓语 和宾语。实际上, 水平表相当于知识图谱的邻接表。水平表的列数是知识图谱中不同谓语的数量, 行数是知识图 谱中不同主语的数量。

  • RDF 数据库系统 DLDB

  • 水平表的缺点在于:

    • (1) 所需列的数目等于知识图谱中不同谓语数量,在真实知识图谱数据集中,不同 谓语数量可能为几千个到上万个,很可能超出关系数据库所允许的表中列数目上限

    • (2) 对于一行来说,仅在极 少数列上具有值, 表中存在大量空值, 空值过多会影响表的存储、索引和查询性能

    • (3) 在知识图谱中,同一主语 和谓语可能具有多个不同宾语,即一对多联系或多值属性,而水平表的一行一列上只能存储一个值,无法应对这种情况 (可以将多个值用分隔符连接存储为一个值,但这违反了关系数据库设计的第一范式);

    • (4) 知识图谱的更新往往会引起谓语的增加、修改或删除,即水平表中列的增加、修改或删除,这是对于表结构的改变,成本很高。

属性表

属性表 (property table) 存储方案是对水平表的细分,将同类主语存到一个表中,解决了表中列数目过多的问题。

  • RDF 三元组库 Jena

  • 属性表既克服了三元组表的自连接问题,又解决了水平表中列数目过多的问题。实际上,水平表就是属性表的一种极端情况,即水平表是将所有主语划归为一类,因此属性表中的空值问题得到很大的缓解。

  • 属性表仍存 在如下一些缺点:

    • (1) 对于规模稍大的真实知识图谱数据,主语的类别可能有几千到上万个,需要建立几千到上万个表,这往往超过了关系数据库的限制

    • (2) 即使在同一类型中,不同主语具有的谓语集合也可能差异较大,会造成与水平表中类似的空值问题

    • (3) 水平表中存在的一对多联系或多值属性存储问题在属性表中仍然存在

垂直划分

垂直划分 (vertical partitioning) 存储方案,为每种谓语建立一张两列的表(subject,object), 表中存放知识图谱中由该谓语连接的主语和宾 语, 表的总数量即知识图谱中不同谓语的数量.

  • SW-Store

  • 优点:

    • (1) 谓语表仅存储出现在 知识图谱中的三元组, 解决了空值问题;

    • (2) 一个主语的一对多联系或多值属性存储在谓语表的多行中, 解决了 多值问题;

    • (3) 每个谓语表都按主语列的值进行排序, 能够使用归并排序连接 (merge-sort join) 快速执行不同谓 语表的连接查询操作.

  • 缺点:

    • (1) 需要创建的表的数目与知识图谱中不同谓语数目相等,而大规模的真实知识图谱 (如 DBpedia、YAGO、WikiData 等) 中谓语数目可能超过几千个,在关系数据库中维护如此规模的表需要花费很大开销

    • (2) 越是复杂的知识图谱查询操作,需要执行的表连接操作数量越多,而对于未指定谓语的三元组查询,将发生需要连接全部谓语表进行查询的极端情况

    • (3) 谓语表的数量越多,数据更新维护代价越大,对于一个主语的更新将涉及多张表,产生很高的更新时 I/O 开销。

六重索引

六重索引 (sextuple indexing) 存储方案是对三元组表的扩展,是一种典型的 “空间换时间” 策略,其将三元组全部 6 种排列对应地建立为 6 张表,即 spo(主语,谓语,宾语)、pos(谓语,宾语,主语)、osp(宾语,主语,谓语)、sop(主语,宾语,谓语)、pso(谓语,主语,宾语)和 ops(宾语,谓语,主语)。不难看出,其中 spo 表就是原来的三元组表。六重索引通过 6 张表的连接操作不仅缓解了三元组表的单表自连接问题,而且提高了某些典型知识图谱查询的效率。

  • RDF-3X , Hexastore

  • 优点:

    • (1) 知识图谱查询中的每种三元组模式查询都可以直接使用相应的索引进行快速 前缀范围查找;

    • (2) 可以通过不同索引表之间的连接操作 直接加速知识图谱上的连接查询.

  • 缺点:

    • (1) 虽然部分缓解了三元组表的单表自连接问题, 但需要花费 6 倍的存 储空间开销、索引维护代价和数据更新时的一致性维护代价, 随着知识图谱规模的增大, 该问题会愈加突出;

    • (2) 当知识图谱查询变得复杂时, 会产生大量的连接索引表查询操作, 依然不可避免索引表的自连接.

  • DB2RDF 是一种面向实体的 RDF 知识图谱存储方案

    • IBM DB2

原生知识图谱存储管理

Neo4j

Neo4j 是目前最流行的属性图数据库,其原生图存储层的最大特点是具有 “无索引邻接(index-free adjacency)” 特性。所谓 “无索引邻接” 是指,每个顶点维护着指向其邻接顶点的直接引用,相当于每个顶点都可看作是其邻接顶点的一个 “局部索引”,用其查找邻接顶点比使用“全局索引” 节省大量时间。这就意味着图导航操作代价与图大小无关,仅与图的遍历范围成正比

gStore

gStore 将 RDF 数据图中每个资源的所有属性和属性值映射到一个二进制位串上。具体而言,对于每个属性 或属性值,gStore 都定义一个固定长度的位串并将位串中所有位置为 0。然后利用若干个预先定义的字符串哈希函数将属性或属性值按照标识符映射到若干个小于位串长度的整数值,进而将位串上这些值所对应的位置置为 1。

分布式图数据库:JanusGraph

JanusGraph 是在原有 Titan 系统基础上继续开发的开源分布式图数据库。JanusGraph 的存储后端与查询引擎是分离的, 可使用分布式 Bigtable 存储库 Cassandra 或 HBase 作为存储后端。JanusGraph 借助第三方分布式索引库 ElasticSearch、Solr 和 Lucene 实现各类型数据的快速检索功能,包括地理信息数据、数值数据和全文搜索。JanusGraph 还具备基于 MapReduce 的图分析引擎,,可将 Gremlin 导航查询转化为 MapReduce 任务。

图计算框架(TinkerPop)

数据存储(Cassandra,HBase,BerkeleyDB)

索引存储(Elasticsearch,Solr,Lucene)

JanusGraph从其框架上来说,是起到一个桥梁的作用。将各种开源的软件连接到一起,形成一个大型图数据库。

OrientDB

OrientDB 最初是由 OrientDB 公司开发的多模型数据库管理系统。OrientDB 虽然支持图、文档、键值、对象、关系等多种数据模型, 但其底层实现主要面向图和文档数据存储管理的需求设计。其存储层中数据记录之间的联系并不是像关系数据库那样通过主外键的引用,而是通过记录之前直接的物理指针。OrientDB 对于数据模式的支持相对灵活,可以管理无模式数据 (schema-less),也可以像关系数据库那样定义完整的模式(schema-full),还可以适应介于两者之间的混合模式(schema-mixed) 数据。在查询语言方面,OrientDB 支持扩展的 SQL 和 Gremlin 用于图上的导航式查询;OrientDB 的 MATCH 语句实现了声明式的模式匹配,这类似于 Cypher 语言查询模式。

Cayley

Cayley 是由 Google 公司工程师开发的一款轻量级开源图数据库。Cayley 的开发受到了 Freebase 知识图谱和 Google 知识图谱背后的图数据存储的影响。Cayley 使用 Go 语言开发,可以作为 Go 类库使用;对外提供 REST API,具有内置的查询编辑器和可视化界面;支持多种查询语言,包括:基于 Gremlin 的 Gizmo、GraphQL 和 MQL;支持多种存储后端, 包括:键值数据库 Bolt、LevelDB, NoSQL 数据库 MongoDB、CouchDB、PouchDB、ElasticSearch,关系数据库 PostgreSQL、MySQL 等。

NebulaGraph

NebulaGraph 是一款完全由杭州悦数科技有限公司自主研发的开源分布式图数据库产品,擅长处理千亿节点万亿条边的超大规模数据集,同时保持毫秒级查询延时。自 2019 年 5 月开源以来,被多家互联网头部企业竞相采用,广泛应用于金融风控、实时推荐、知识图谱等业务场景。早期采用者包括腾讯、美团、京东、360数科、微众银行、小红书、知乎、快手、BOSS直聘等知名互联网企业,随着图数据库技术的日益普及以及业务场景的不断发掘,越来越多行业加入了 NebulaGraph 社区,包括中国移动、众安保险、泰康人寿等。

性能高效:高可用,高吞吐低时延

NebulaGraph 的图数据库采用原生分布式结构,得益于其 shared-nothing 以及存储与计算分离的架构设计,NebulaGraph 具备在线水平扩缩容能力;原生分布式架构,使用 Raft 协议保证数据一致性,确保集群高可用;同时兼容 openCypher,能够无缝对接 Neo4j 用户,降低学习及迁移成本。

开源社区:数千名成员,日常互动活跃

NebulaGraph 的开发者社区聚集了几千名社区成员和超百位社区代码贡献者,项目在 GitHub 上积累了超过 7800 个 star。近期被 CSDN 选为 2021 年的 “年度开源项目”。英国投资公司 OXX.VC 也将 NebulaGraph 评选为 2021 年成长最快的开源公司,与 Airbyte、Supabase 等广受欢迎的开源项目并列。

官网:https://www.nebula-graph.com.cn/

git:https://github.com/vesoft-inc/nebula

性能对比:https://discuss.nebula-graph.com.cn/t/topic/11727

文档:https://docs.nebula-graph.com.cn/3.6.0/1.introduction/1.what-is-nebula-graph/

其他原生图数据库

Amazon 云平台的 Amazon Neptune 多模型图数据库 Arango DB 微软的 Azure CosmosDB DataStax 的 Enterprise Graph Sparsity 的 Sparksee TigerGraph

图数据库选型准则

在图数据库的选型上我们主要考虑了以下 5 点:

  • (A) 项目开源,暂不考虑需付费的图数据库

  • (B) 分布式架构设计,具备良好的可扩展性

  • (C) 毫秒级的多跳查询延迟

  • (D) 支持千亿量级点边存储

  • (E) 具备批量从数仓导入数据的能力

针对主流图数据库,进行选型分析

DB-Engines Ranking of Graph DBMS 剔除不开源的项目,可分为:

  1. Neo4j、ArangoDB、Virtuoso、TigerGraph、RedisGraph。 此类图数据库只有单机版本开源可用,性能优秀,但不能应对分布式场景中数据的规模增长,即不满足选型要求(B)、(D)。

  2. JanusGraph、HugeGraph。 此类图数据库在现有存储系统之上新增了通用的图语义解释层,图语义层提供了图遍历的能力,但是受到存储层或者架构限制,不支持完整的计算下推,多跳遍历的性能较差,很难满足 OLTP(on-line transaction processing)场景下对低延时的要求,即不满足选型要求(C)。

  3. DGraph、NebulaGraph。 此类图数据库根据图数据的特点对数据存储模型、点边分布、执行引擎进行了全新设计,对图的多跳遍历进行了深度优化,基本满足我们的选型要求。

图数据库对比

NebulaGraph vs. Dgraph vs. HugeGraph

NebulaGraph vs. Dgraph vs. HugeGraph 的对比分析

部署方案

实时数据写入

查询对比

Neo4j vs HugeGraph vs NebulaGraph

Neo4j vs HugeGraph vs NebulaGraph 的对比分析

图形数据大小平台数据导入一跳查询两查询共享好友查询
1000 万条边Neo4j26 秒6.618 秒6.644 秒6.661 秒
HugeGraph89 秒16 毫秒22 毫秒72 毫秒
NebulaGraph32.63 秒1.482 毫秒3.095 毫秒0.994 毫秒
1 亿条边Neo4j1 分 21 秒42.921 秒43.332 秒44.072 秒
HugeGraph10 分19 毫秒20 毫秒5 秒
NebulaGraph3 分 52 秒1.971 毫秒4.34 毫秒4.147 毫秒
10 亿条边Neo4j8 分 34 秒165.397 秒176.272 秒168.256 秒
HugeGraph65 分19 毫秒651 毫秒3.8 秒
NebulaGraph29 分 35 秒2.035 秒22.48 毫秒1.761 毫秒
80 亿条边缘Neo4j1 小时 23 分钟314.34 秒393.18 秒608.27 秒
HugeGraph16 小时68 毫秒24 秒541 毫秒
NebulaGraph~30 分钟小于 1s小于 5 秒小于 1s

架构:

Dgraph vs. HugeGraph vs. JanusGraph vs. NebulaGraph vs. Neo4j

Dgraph vs. HugeGraph vs. JanusGraph vs. NebulaGraph vs. Neo4j 的对比分析

主要知识图谱数据库对比

常见知识图谱数据库管理系统的比较

类型名称许可证数据模型 / 存储方案查询语言是否活跃
基于关系3store开源RDF 图 / 三元组表SPARQL
DLDB研究原型RDF 图 / 水平表SPARQL早期系统, 水平表存储方案的代表性系统
Jena开源RDF 图 / 属性表SPARQL主流的语义 Web 工具库、RDF 数据库和 OWL 推理工具
SW-Store研究原型RDF 图 / 垂直划分SPARQL科研原型系统, 垂直划分存储方案的代表性系统
IBM DB2商业RDF 图 / DB2RDFSPARQL/ SQL支持 RDF 的主流商业数据库
Oracle 18c商业RDF 图 / 关系存储SPARQL/ PGQL支持 RDF 的主流商业数据库
RDF 三元组库RDF4J开源RDF 图 / SAIL APISPARQL
RDF-3X开源RDF 图 / 六重索引SPARQL科研原型系统, 六重索引存储方案的代表性系统
gStore开源研究原型RDF 图 / VS * 树SPARQL科研原型系统, 原生图存储, 使用了基于位串图存储技术
Virtuoso商业 / 开源RDF 图 / 多模型混合SPARQL/ SQL语义 Web 项目常用的 RDF 数据库, 基于成熟的 SQL 引擎
AllegroGraph商业RDF 图 / 三元组索引SPARQL对语义推理功能具有较为完善的支持
GraphDB商业RDF 图 / 三元组索引SPARQL支持语义 Web 标准的主流产品, 支持 SAIL 层推理功能
BlazeGraph商业RDF 图 / 三元组索引SPARQL/ Gremlin基于 RDF 三元组库的图数据库, 实现了 SPARQL 和 Gremlin
StarDog商业RDF 图 / 三元组索引SPARQL对 OWL2 推理机制具有良好的支持
原生图数据库Neo4j商业 / 开源属性图 / 原生图存储Cypher
JanusGraph开源属性图分布式存储Gremlin分布式图数据库, 存储后端与查询引擎分离, 实现了 Gremlin
OrientDB商业属性图 / 原生图存储SQL/ Gremlin支持多模型的原生图数据管理系统, 对数据模式的灵活支持
Cayley开源RDF 图 / 外部存储Gremlin/ GraphQL轻量级开源图数据库, 易于扩展对新语言和存储后端的支持
分布式系统与框架Sempala开源研究原型RDF 图 / 分布式存储SPARQL
TriAD开源研究原型RDF 图 / 分布式存储六重索引SPARQL基于 MPI 框架的异步通信协议
H2RDF+开源研究原型RDF 图 / 分布式存储六重索引SPARQL基于 HBase 构建六重索引
S2RDF开源研究原型RDF 图 / 分布式存储垂直划分SPARQL基于 Spark 框架建立大量索引
Stylus开源研究原型RDF 图 / 分布式存储属性表优化SPARQL基于分布式内存键值库的 RDF 三元组库
Apache Rya开源RDF 图 / 分布式存储三元组索引SPARQL基于列存储 Accumulo 的 RDF 三元组库
Cypher for Apache Spark开源属性图 / 分布式存储 DataFrameCypher基于 Spark 框架的 Cypher 引擎

JanusGraph(尚可)、Neo4j(老牌先入为主不一定最佳)、Dgraph(尚可)、NebulaGraph(推荐) 四款图数据库比较。

特性JanusGraphNeo4jDgraphNebulaGraph
首次发布2017 年2007 年2016 年2019 年
开发语言JavaJavaGoC++
开源
属性图模型完整的属性图模型完整的属性图模型类 RDF 存储完整的属性图模型
架构分布式单机分布式分布式
存储后端Hbase、Cassandra、
BerkeleyDB
自定义文件格式键值数据库 BadgerDB键值数据库
RocksDB
高可用性支 持不支持支持支持
高可靠性支 持不支持支持支持
一致性协议Paxos 等RAFTRAFT
跨数据中心复制支 持不支持支持不支持
事务ACID 或 BASE完全的 ACID0mid 修改版不支持
分区策略随机分区,支持显式指定分区策略不支持分区自动分区静态分区
大数据平台集成Spark、Hadoop、GiraphSpark不支持Spark、Flink
查询语言GremlinCypherGraphQLnGQL
全文检索ElasticSearch、Solr、Lucene内置内置ElasticSearch
多个图支持创建任意多图一个实例只能有一个图一个集群只能有一个图支持创建任意多图
属性图模式多种约束方法可选模式约束无模式强制模式约束
客户端协议HTTP、WebSocketsHTTP、BOLTHTTP、gRPC 等HTTP
客户端语言Java、Python、C#、Go、Ruby
Java、Python、Go 等Java、Go、Python、等Python、Java 等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大唐极简史

唐朝(618年-907年),是中国历史上一个强盛的朝代,以其疆域辽阔、政治稳重、经济繁荣、文化繁荣而著称。唐朝的开国皇帝是李渊,他建立了一个强大的中央集权政府,使得唐朝成为当时世界上最繁荣的国家之一。 唐…

vmware虚拟机补救

更新了虚拟机里面工具和资料,进行了磁盘整理和压缩,虚拟机运行进不去系统了。 网站找的修复方法均不可行。补救措施:利用DiskGenius.exe(要用高版本不然复制的时候就知道了) DG1342.rar - 蓝奏云 加载虚拟硬盘 2008x…

最新微信支付商家转账到零钱各场景怎样开通?

商家转账到零钱是什么? 商家转账到零钱是企业付款到零钱的升级版,它的功能是,如果系统需要对用户支付费用,比如发放佣金、提成、退款等,可以直接转账到用户的微信零钱。这个功能在 2022 年 5 月 18 日之前叫做企业付款…

2024年MathorCup数模竞赛B题问题一二三+部分代码分享

inputFolderPath E:\oracle\images\; outputFolderPath E:\oracle\process\; % 获取文件夹中所有图片的文件列表 imageFiles dir(fullfile(inputFolderPath, *.jpg)); % 设置colorbar范围阈值 threshold 120; % 遍历每个图片文件 for i 1:length(imageFiles) % 读…

个人网站制作 Part 18 提升用户体验:添加页面404错误处理 | Web开发项目

文章目录 👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 添加404错误处理页面🔨创建404错误处理页面🔧步骤 1: 在项目根目录创建404错误处理页面🔧步骤 2: 添加404错误处理页面内容 &#x1f…

数据结构复习指导之绪论(数据结构的基本概念)

文章目录 绪论: 考纲内容 知识框架 复习提示 1.数据结构的基本概念 1.1基本概念和术语 1.数据 2.数据元素 3.数据对象 4.数据类型 5.数据结构 1.2数据结构三要素 1.数据的逻辑结构 2.数据的存储结构 3.数据的运算 绪论: 考纲内容 算法时…

计算机网络----第十天

配置vlan 广播风暴的含义: 含义:设备发出的广播帧在广播域中传播,占用网络带宽,降低设备性能 隔离广播的方式: 方式:用路由器来隔离广播 用VLN隔离广播 vlan的定义: 定义:虚拟…

13-pyspark的共享变量用法总结

目录 前言广播变量广播变量的作用 广播变量的使用方式 累加器累加器的作用累加器的优缺点累加器的使用方式 PySpark实战笔记系列第四篇 10-用PySpark建立第一个Spark RDD(PySpark实战笔记系列第一篇)11-pyspark的RDD的变换与动作算子总结(PySpark实战笔记系列第二篇))12-pysp…

海外媒体宣发:这7个旅游业媒体套餐击中宣传痛点-华媒舍

旅游业如何有效宣传自身成为了一个重要的问题。众多旅游企业却面临着宣传痛点,即无法将优质内容传达给目标受众。近期,出现了7个旅游业媒体套餐,它们被称为解决宣传痛点的突破性方案。本文将介绍这7个旅游业媒体套餐,并说明它们为…

一篇实操vitrualbox虚拟机根目录扩容(详细,实操陈功)

一篇实操vitrualbox虚拟机根目录扩容(详细,实操陈功) 创建虚拟介质 第一步、 第二步、 第三步、一直下一步,直到下面的页面 分配空间到更目录下 第一步、 第二步、查看创建的物理磁盘 lsblk第三步、查看原本磁盘可用空间 df …

掌握现代 C++:Lambda 在 C++14、C++17 和 C++20 中的演变

深入研究Lambda 在 C14、C17 和 C20 中的演变 一、背景二、C14 中的 Lambda2.1、默认参数2.2、模板参数2.3、广义捕获2.4、从函数返回 lambda 三、C17 中的 Lambda四、C20 中的 Lambda总结 一、背景 Lambda 是现代 C 最受欢迎的功能之一。自从在 C 11 中引入以来,它…

Day 23 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇

修剪二叉搜索树 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 ​ 最直接的想法&#xff0…

【CSS】SVG图片属性及修改颜色

最近的开发中遇到了SVG不能修改颜色的问题,以前是直接用,没有研究过,现在搞个笔记记录下 SVG的属性: width:设置最终SVG图片的宽度height:设置最终SVG图片的高度viewbox:视区,在svg上截取一块&#xff0c…

【C++学习】C++智能指针:提高代码安全与性能的利器

文章标题 智能指针的提出智能指针概念及使用RAII 智能指针的原理C库多种智能指针详解版本一:std::auto_ptr(C98)1. std::auto_ptr 使用2. std::auto_ptr 原理3. std::auto_ptr 模拟实现 版本二:unique_ptr (C11)1. unique_ptr 的使…

Unity之PUN实现多人联机射击游戏的优化(Section 3)

目录 💣一、准备工作 💣二、生成弹头脚本的编写 💣三、实现发射和伤害同步 手雷都加了在给狗剩加个火箭筒不过分吧。效果看GIF动图,分别是单机和联机的效果。 添加火箭筒依旧是在原有的基础上更改,我查看火箭筒模型…

基于STC12C5A60S2系列1T 8051单片机的LCD1602显示中文英文数字小数字库字符自定义字符的应用

基于STC12C5A60S2系列1T 8051单片机的LCD1602显示中文英文数字小数字库字符自定义字符的应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍LCD1602字符型液晶显示器介…

策略模式:灵活调整算法的设计精髓

在软件开发中,策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。通过定义一系列算法,并将每个算法封装起来,策略模式使得算法可以互换使用,这使得算法可以独立于使用它们的客户。本文将详细介绍策略模式的…

算法——栈

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享关于栈相关的算法 如果有不足的或者错误的请您指出! 目录 1.删除字符中的所有相邻重复项1.1解析1.2题解 2.比较含退格的字符串2.1解析2.2题解 3.基本计算器II3.1解析3.2题解 4.…

清明美食制作|“心灵护航,增能培力”残疾人职业能力提升培养

为提高残疾人的动手能力,提升个人的自身素质和自主就业创业能力,弘扬中华民族传统文化,临近清明之际,淳安县从益舍社会工作服务中心于浪川乡展开了以“品尝春天味道 制作清明粿 清明美食制作”为主题的清明节活动。 【清明粿制作】…

【C语言__函数__复习篇1】

目录 前言: 一、C语言中函数的概念 二、库函数 2.1 库函数的概念 2.2 怎样自学库函数——以sqrt函数为例 三、自定义函数 3.1 自定义函数的概念 3.2 自定义函数的语法形式 3.3 函数的实参 3.4 函数的形参 3.5 实参与形参的关系 3.6 return语句 3.7 数组传参 …