 ⽤ egg 孵化你的 SQL 优化器 - 王润基$1.1, $1.2 Scan $2.1, $2.2 Projection #1, #3 ⼀个 SQL 语句优化的例⼦ 基于规则的优化 (RBO) 基于代价的优化 (CBO) 谓词下推 Join Filter A B Join Filter A B Filter Join A Join B C Join C Join A B Join Hash Join (filter (= $1.2 “Bob”) (scan $1 (list $1.1 $1.2))) (scan $2 (list $2.1 $2.2)) )) 定义规则:谓词下推 分析:Column Analysis (join inner (and (= $1.1 $2.1) (= $1.2 “Bob”)) (scan $1 (list $1.1 $1.2)) 分析 聚合分析 — 类型检查 — 通配符展开 — 聚合提取 常量分析 列分析 ⾏分析 类型分析 Schema 分析 — 类型解析 — 物理下标解析 — 常量折叠 — 算⼦下推 — 代价估计 — 其它优化 RecExpr Logical Plan RecExpr Physical Plan 39ms 1s scale factors = 1 in-memory0 码力 | 39 页 | 6.48 MB | 1 年前3 ⽤ egg 孵化你的 SQL 优化器 - 王润基$1.1, $1.2 Scan $2.1, $2.2 Projection #1, #3 ⼀个 SQL 语句优化的例⼦ 基于规则的优化 (RBO) 基于代价的优化 (CBO) 谓词下推 Join Filter A B Join Filter A B Filter Join A Join B C Join C Join A B Join Hash Join (filter (= $1.2 “Bob”) (scan $1 (list $1.1 $1.2))) (scan $2 (list $2.1 $2.2)) )) 定义规则:谓词下推 分析:Column Analysis (join inner (and (= $1.1 $2.1) (= $1.2 “Bob”)) (scan $1 (list $1.1 $1.2)) 分析 聚合分析 — 类型检查 — 通配符展开 — 聚合提取 常量分析 列分析 ⾏分析 类型分析 Schema 分析 — 类型解析 — 物理下标解析 — 常量折叠 — 算⼦下推 — 代价估计 — 其它优化 RecExpr Logical Plan RecExpr Physical Plan 39ms 1s scale factors = 1 in-memory0 码力 | 39 页 | 6.48 MB | 1 年前3
 Real world Rust
- Why and how we use Rust in TiKV支持 MVCC 无锁的快照读 ● 构建于 Raft 之上,不依赖分布式文件系统 ○ 更少的第三方依赖 ○ 更高的性能(低延迟) ● 配合 TiDB 使用,需要有健全的逻辑实现 SQL 层的下推算子 TiKV 的前置需求 ● 极高的性能要求,尽可能低延迟,而且延迟需要稳定 ● 设计分布式系统的逻辑,极其复杂 ○ Raft ○ Multi-Raft ○ 分布式测试框架 ● 和0 码力 | 29 页 | 506.53 KB | 1 年前3 Real world Rust
- Why and how we use Rust in TiKV支持 MVCC 无锁的快照读 ● 构建于 Raft 之上,不依赖分布式文件系统 ○ 更少的第三方依赖 ○ 更高的性能(低延迟) ● 配合 TiDB 使用,需要有健全的逻辑实现 SQL 层的下推算子 TiKV 的前置需求 ● 极高的性能要求,尽可能低延迟,而且延迟需要稳定 ● 设计分布式系统的逻辑,极其复杂 ○ Raft ○ Multi-Raft ○ 分布式测试框架 ● 和0 码力 | 29 页 | 506.53 KB | 1 年前3
 新一代分布式高性能图数据库的构建 - 沈游人Cost model Storage backend ( Property Graph KV store ) Pushdown filter Cypher (a)-[:LIKES]->(b) 计算下推:面向图应用特征设计 分布式存储 Find Vertex Walk Vertex Scan Cartesian Product Projection Filter Stage Stage0 码力 | 38 页 | 24.68 MB | 1 年前3 新一代分布式高性能图数据库的构建 - 沈游人Cost model Storage backend ( Property Graph KV store ) Pushdown filter Cypher (a)-[:LIKES]->(b) 计算下推:面向图应用特征设计 分布式存储 Find Vertex Walk Vertex Scan Cartesian Product Projection Filter Stage Stage0 码力 | 38 页 | 24.68 MB | 1 年前3
 统一建模语言 UML 参考手册 - 基本概念显示了关联的设计属性 � � 聚集和组合 聚集和组合 聚集和组合 聚集和组合 聚集是表达主体 部分关系的关联 它用在聚集端的菱形符号来表示 组合 是关联的更强的形式 该关系中组合具有管理组成部分的特有责任 如它们的分配和释放 它用组合端的实心菱形来表达 在每个体现整体和部分的类之间具有各自的关联 但出于 方便 整体端的路径被统一在一起 从而整个关联可以绘制成树结构 图 ��� 显示了聚集 和组合 � ��� 动时不允许迁移 动作状态通常用于短时间的记录操作 � 活动图可能包含分支 ������ 以及并发线索中控制的分叉 ���� 并发线索代表了可 以被组织中不同对象或人员并发执行的活动 并发常常从聚集中衍生 聚集中每个对象具 有自己的控制线索 并发活动可以同时或以任何次序运行 活动图与传统的流程图很相似 除了它不但允许顺序控制 而且允许并发控制 非常大的区别 � 活动图 活动图 活动图 活动图� 活动图 它仅仅 是个总结 � 自顶向下的路径反映了整个系统的体系结构 自下而上的路径可以自动的从元素个体中 产生 两种路径在建模中均占有一席之地 即使在同一个系统中 � 元素个体之间的同种类的多个依赖被聚集成单个的包级别的依赖 如果元素个体间的依 ��� 参考指南� � 模型管理视图� ������� 赖包括版型 如不同的用法 该版型在包级别的依赖中被忽略以产生单一的高级别依赖 � 包显示为带方型突起的长方形0 码力 | 123 页 | 2.61 MB | 1 年前3 统一建模语言 UML 参考手册 - 基本概念显示了关联的设计属性 � � 聚集和组合 聚集和组合 聚集和组合 聚集和组合 聚集是表达主体 部分关系的关联 它用在聚集端的菱形符号来表示 组合 是关联的更强的形式 该关系中组合具有管理组成部分的特有责任 如它们的分配和释放 它用组合端的实心菱形来表达 在每个体现整体和部分的类之间具有各自的关联 但出于 方便 整体端的路径被统一在一起 从而整个关联可以绘制成树结构 图 ��� 显示了聚集 和组合 � ��� 动时不允许迁移 动作状态通常用于短时间的记录操作 � 活动图可能包含分支 ������ 以及并发线索中控制的分叉 ���� 并发线索代表了可 以被组织中不同对象或人员并发执行的活动 并发常常从聚集中衍生 聚集中每个对象具 有自己的控制线索 并发活动可以同时或以任何次序运行 活动图与传统的流程图很相似 除了它不但允许顺序控制 而且允许并发控制 非常大的区别 � 活动图 活动图 活动图 活动图� 活动图 它仅仅 是个总结 � 自顶向下的路径反映了整个系统的体系结构 自下而上的路径可以自动的从元素个体中 产生 两种路径在建模中均占有一席之地 即使在同一个系统中 � 元素个体之间的同种类的多个依赖被聚集成单个的包级别的依赖 如果元素个体间的依 ��� 参考指南� � 模型管理视图� ������� 赖包括版型 如不同的用法 该版型在包级别的依赖中被忽略以产生单一的高级别依赖 � 包显示为带方型突起的长方形0 码力 | 123 页 | 2.61 MB | 1 年前3
 Apache Shiro参考手册中文版判断用户是否被允许做某事  在任何环境下使用 Session API,即使没有 Web 或 EJB 容器。  在身份验证,访问控制期间或在会话的生命周期,对事件作出反应。  聚集一个或多个用户安全数据的数据源,并作为一个单一的复合用户“视图”。  启用单点登录(SSO)功能。  为没有关联到登录的用户启用"Remember Me"服务 … 以及更多——全部集成到紧密结合的易于使用的 apache.shiro.authc.pam.AbstractAuthenticationStrategy 作为出发点。AbstractAuthenticationStrategy 类自动实 现“捆绑”/聚集行为,从每一个 Realm 合并结果到一个单一的 AuthenticationInfo 实例。 Realm 的验证顺序 需要指出非常重要的一点是,ModularRealmAuthenticator Container-Independent Clustering! - Shiro 的会话可以很容易地聚集通过使用任何随手可用的网络缓存产品,像 Ehcache + Terracotta,Coherence,GigaSpaces,等等。这意味着你可以为 Shiro 配置会话群集一次且仅一次, 无论你部署到什么容器中,你的会话将以相同的方式聚集。不需要容器的具体配置!  Heterogeneous Client Access0 码力 | 92 页 | 1.16 MB | 1 年前3 Apache Shiro参考手册中文版判断用户是否被允许做某事  在任何环境下使用 Session API,即使没有 Web 或 EJB 容器。  在身份验证,访问控制期间或在会话的生命周期,对事件作出反应。  聚集一个或多个用户安全数据的数据源,并作为一个单一的复合用户“视图”。  启用单点登录(SSO)功能。  为没有关联到登录的用户启用"Remember Me"服务 … 以及更多——全部集成到紧密结合的易于使用的 apache.shiro.authc.pam.AbstractAuthenticationStrategy 作为出发点。AbstractAuthenticationStrategy 类自动实 现“捆绑”/聚集行为,从每一个 Realm 合并结果到一个单一的 AuthenticationInfo 实例。 Realm 的验证顺序 需要指出非常重要的一点是,ModularRealmAuthenticator Container-Independent Clustering! - Shiro 的会话可以很容易地聚集通过使用任何随手可用的网络缓存产品,像 Ehcache + Terracotta,Coherence,GigaSpaces,等等。这意味着你可以为 Shiro 配置会话群集一次且仅一次, 无论你部署到什么容器中,你的会话将以相同的方式聚集。不需要容器的具体配置!  Heterogeneous Client Access0 码力 | 92 页 | 1.16 MB | 1 年前3
 1_丁来强_开源AIOps数据中台搭建与Python的作用⽂文本、⼯工单、知识库;API;代码等 • ⼤大数据的3V(容量量、变化、种类) 数据类型⽐比较 数据类型与⽐比较 ⽇日志 Tracking 指标 ⽂文本 数据格式 ⾮非结构化 半结构化,数据关联 结构化(聚集) ⾮非结构化 数据量量 ⼤大 较⼤大 ⼀一般到极⼤大(IoT) ⼀一般 单条⼤大⼩小 100~10KB 100~10KB < 500 100~10KB 采集难度 ⼀一般 较难 ⼀一般 ⼀一般 引⼊队列,解决丢数据问题 部署、维护复杂度较为复杂 Elasticsearch核⼼能⼒ • 简单,易易扩展,功能集丰富,⽣生态活跃 • NoSQL,schema灵活 • 全⽂文索引查询强,过滤快、聚集功能强⼤大 • 不不⽀支持外部关联,有SQL适配器器 • 缺点: • 企业特性需要商业License • 内存管理理挑战较⼤大,复杂统计易易失控 • 超过百TB规模后运维成本⾼高0 码力 | 48 页 | 17.54 MB | 1 年前3 1_丁来强_开源AIOps数据中台搭建与Python的作用⽂文本、⼯工单、知识库;API;代码等 • ⼤大数据的3V(容量量、变化、种类) 数据类型⽐比较 数据类型与⽐比较 ⽇日志 Tracking 指标 ⽂文本 数据格式 ⾮非结构化 半结构化,数据关联 结构化(聚集) ⾮非结构化 数据量量 ⼤大 较⼤大 ⼀一般到极⼤大(IoT) ⼀一般 单条⼤大⼩小 100~10KB 100~10KB < 500 100~10KB 采集难度 ⼀一般 较难 ⼀一般 ⼀一般 引⼊队列,解决丢数据问题 部署、维护复杂度较为复杂 Elasticsearch核⼼能⼒ • 简单,易易扩展,功能集丰富,⽣生态活跃 • NoSQL,schema灵活 • 全⽂文索引查询强,过滤快、聚集功能强⼤大 • 不不⽀支持外部关联,有SQL适配器器 • 缺点: • 企业特性需要商业License • 内存管理理挑战较⼤大,复杂统计易易失控 • 超过百TB规模后运维成本⾼高0 码力 | 48 页 | 17.54 MB | 1 年前3
 Hello 算法 1.0.0b1 Java版线性探测存在以下缺陷: ‧ 不能直接删除元素。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认 为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。桶内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促 进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 多次哈希 顾名思义,「多次哈希」的思路是使用多个哈希函数 1. 找到目标元素,则返回之; 2. 到空位或已尝试所有哈希函数,说明哈希表中无此元素; 6. 散列表 hello‑algo.com 90 相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 64 时,长度大于 8 的链 表会被转化为「红黑树」,以提升查找性能。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算 量。 ‧ 在工业界中,Java 的 HashMap 采用链式地址、Python 的 Dict 采用开放寻址。 91 7. 树0 码力 | 186 页 | 14.71 MB | 1 年前3 Hello 算法 1.0.0b1 Java版线性探测存在以下缺陷: ‧ 不能直接删除元素。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认 为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。桶内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促 进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 多次哈希 顾名思义,「多次哈希」的思路是使用多个哈希函数 1. 找到目标元素,则返回之; 2. 到空位或已尝试所有哈希函数,说明哈希表中无此元素; 6. 散列表 hello‑algo.com 90 相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 64 时,长度大于 8 的链 表会被转化为「红黑树」,以提升查找性能。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算 量。 ‧ 在工业界中,Java 的 HashMap 采用链式地址、Python 的 Dict 采用开放寻址。 91 7. 树0 码力 | 186 页 | 14.71 MB | 1 年前3
 Hello 算法 1.0.0b1 Swift版线性探测存在以下缺陷: ‧ 不能直接删除元素。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认 为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。桶内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促 进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 多次哈希 顾名思义,「多次哈希」的思路是使用多个哈希函数 查找元素:以相同的哈希函数顺序查找,存在两种情况: 1. 找到目标元素,则返回之; 2. 到空位或已尝试所有哈希函数,说明哈希表中无此元素; 相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 64 时,长度大于 8 的链 表会被转化为「红黑树」,以提升查找性能。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算 量。 ‧ 在工业界中,Java 的 HashMap 采用链式地址、Python 的 Dict 采用开放寻址。 93 7. 树 70 码力 | 190 页 | 14.71 MB | 1 年前3 Hello 算法 1.0.0b1 Swift版线性探测存在以下缺陷: ‧ 不能直接删除元素。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认 为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。桶内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促 进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 多次哈希 顾名思义,「多次哈希」的思路是使用多个哈希函数 查找元素:以相同的哈希函数顺序查找,存在两种情况: 1. 找到目标元素,则返回之; 2. 到空位或已尝试所有哈希函数,说明哈希表中无此元素; 相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 64 时,长度大于 8 的链 表会被转化为「红黑树」,以提升查找性能。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算 量。 ‧ 在工业界中,Java 的 HashMap 采用链式地址、Python 的 Dict 采用开放寻址。 93 7. 树 70 码力 | 190 页 | 14.71 MB | 1 年前3
 Hello 算法 1.0.0b1 Python版线性探测存在以下缺陷: ‧ 不能直接删除元素。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认 为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。桶内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促 进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 多次哈希 顾名思义,「多次哈希」的思路是使用多个哈希函数 查找元素:以相同的哈希函数顺序查找,存在两种情况: 1. 找到目标元素,则返回之; 2. 到空位或已尝试所有哈希函数,说明哈希表中无此元素; 相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 64 时,长度大于 8 的链 表会被转化为「红黑树」,以提升查找性能。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算 量。 ‧ 在工业界中,Java 的 HashMap 采用链式地址、Python 的 Dict 采用开放寻址。 84 7. 树0 码力 | 178 页 | 14.67 MB | 1 年前3 Hello 算法 1.0.0b1 Python版线性探测存在以下缺陷: ‧ 不能直接删除元素。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认 为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。桶内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促 进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 多次哈希 顾名思义,「多次哈希」的思路是使用多个哈希函数 查找元素:以相同的哈希函数顺序查找,存在两种情况: 1. 找到目标元素,则返回之; 2. 到空位或已尝试所有哈希函数,说明哈希表中无此元素; 相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 64 时,长度大于 8 的链 表会被转化为「红黑树」,以提升查找性能。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算 量。 ‧ 在工业界中,Java 的 HashMap 采用链式地址、Python 的 Dict 采用开放寻址。 84 7. 树0 码力 | 178 页 | 14.67 MB | 1 年前3
 Hello 算法 1.0.0b1 C++版线性探测存在以下缺陷: ‧ 不能直接删除元素。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认 为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。桶内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促 进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 多次哈希 顾名思义,「多次哈希」的思路是使用多个哈希函数 查找元素:以相同的哈希函数顺序查找,存在两种情况: 1. 找到目标元素,则返回之; 2. 到空位或已尝试所有哈希函数,说明哈希表中无此元素; 相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 64 时,长度大于 8 的链 表会被转化为「红黑树」,以提升查找性能。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算 量。 ‧ 在工业界中,Java 的 HashMap 采用链式地址、Python 的 Dict 采用开放寻址。 91 7. 树 70 码力 | 187 页 | 14.71 MB | 1 年前3 Hello 算法 1.0.0b1 C++版线性探测存在以下缺陷: ‧ 不能直接删除元素。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认 为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。桶内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促 进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 多次哈希 顾名思义,「多次哈希」的思路是使用多个哈希函数 查找元素:以相同的哈希函数顺序查找,存在两种情况: 1. 找到目标元素,则返回之; 2. 到空位或已尝试所有哈希函数,说明哈希表中无此元素; 相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 64 时,长度大于 8 的链 表会被转化为「红黑树」,以提升查找性能。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算 量。 ‧ 在工业界中,Java 的 HashMap 采用链式地址、Python 的 Dict 采用开放寻址。 91 7. 树 70 码力 | 187 页 | 14.71 MB | 1 年前3
共 115 条
- 1
- 2
- 3
- 4
- 5
- 6
- 12














