B 树与二叉树

2024-01-03

如果我使用 b 树实现内存(RAM)搜索操作,那么与二叉树相比,它在缓存或其他一些效果方面会更好吗?

我所知道的是——

binary search tress---O(log n)
btrees ---------------O(c log n)

各种博客上对此进行了很多讨论。


Algorithmic complexity is the same, since O(logb n) = O(c log n) = O(log n) but the constant factors, which are hidden in big-O notation, could vary noticeably, depending on implementation and hardware.

B 树是为盘片硬盘设计的,它具有较长的访问时间(将磁头移动到位),然后读取整个物理扇区。使 B 树节点与扇区一样大可以最大限度地减少访问次数,并最大限度地提高每次读取操作的有用数据。

但是,如果您的内存不足,则访问时间可以忽略不计,因此更好的比较是计算算法访问的单个单词的数量。

For example, let's plan a data structure to store 220 keys of 1 word each, for a total of 4MiB of raw data on a 32bit machine.

A binary search tree will have 220 nodes, each holding one key and two pointers (3 words). Depth will be log2(220) = 20. The average search will have to read the key and one of the pointers from each node in its path, from the root all the way down = 40 words.

A B-tree made for hard disks will have 4kB nodes. Each node could be stored internally as a sorted array of key and pointer couples, between 256 and 512 of them. What is the average search going to look like? Considering an average 3/4 fill, each node will contain 384 entries, and its internal binary search will have to visit on average log2(384) = 5.95 keys. The average depth will be log384(220) = 2.33, so our search will have to read on average 2.33 times 5.95 keys, or about 14 words.

In the case of a low-fanout (branching factor) B-tree, with each node holding between 16 and 32 keys, the average fill will be 24 keys, the average depth log24(220) = 4.36, the binary search in each node will make log2(24) = 4.58 comparisons, and the overall average search will have to read about 20 words.

请记住,最后两个数据结构比二叉树获得了更好的结果,因为它们优化读取操作过度修改。要将键插入这些 B 树之一,您必须平均重写整个 384 字或 24 字节点(如果不超过一个),而在二叉树情况下,写入操作仍然只需要最多触摸 40 个单词。

(之前我错了。感谢@virco 和@Groo 在评论中指出我的错误。)

无论如何,看起来扇出较低的纯内存 B 树在实践中似乎比二叉树表现更好 http://panthema.net/2007/stx-btree/speedtest/.

每个节点 32 个密钥似乎是当前架构(32 位和 64 位)的最佳选择。许多较新的语言和库正在使用 32 键 B 树作为内置数据结构,与哈希表和数组一起使用或作为哈希表和数组的替代品。这种用法是由Clojure http://clojure.org/和其他函数式语言,但随后被 Javascript 等更主流的语言所采用,最近的重点是不可变数据结构(例如不可变.js https://facebook.github.io/immutable-js/)

这个结果不仅可以通过计算从内存读取的字数来解释,还可以通过高速缓存未命中来解释,高速缓存未命中是导致 CPU 停止并等待 RAM 的读取操作。如果缓存架构可以一次获取包含整个 B 树节点的 RAM 块,我们就可以获得与基于磁盘的大容量存储成功使用的相同优化。

在硬盘优化数据结构的情况下,我们将使用节点与物理磁盘扇区一样大的 B 树,以最大限度地减少磁盘访问时间。在本例中,我们使用 B 树,其节点与 3 级缓存对 RAM 执行的读取操作一样大,以最大限度地减少缓存未命中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

B 树与二叉树 的相关文章

  • 基数首先排序最重要的还是最不重要的,哪个更快?

    我一直在研究基数排序实现 到目前为止粘贴在下面的代码 代码是用 Java 编写的 但在 C C 中应该也能正常工作 正如您从实现中看到的 我首先执行最高有效位 即整数的第 31 位 这似乎更快 因为一旦子组完成 就不再需要迭代 例如 打个比
  • 如何使用 python 子进程杀死性能记录?

    我正在尝试使用性能实用程序 https www brendangregg com perf html监视我的系统 它将在 python 脚本中启动和终止 我创建了一个沙箱 如下所示 extra params F 99 g a record
  • 在 python 中高效、快速地迭代元组列表中超过 3600 万个项目

    首先 在任何人将其标记为重复之前 请阅读以下内容 我不确定迭代的延迟是否是由于尺寸巨大或我的逻辑造成的 我有一个必须迭代的用例3600 万件商品在元组列表中 我的主要要求是速度和效率 样本清单 how are you I am fine h
  • 有什么办法可以让这个 C# 代码更快吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在读取一个大文件 X12 并解析其中的信息 我有两个瓶颈功能 我似乎无法解决 read line 和 get element 有什
  • SQL 中的 JOIN 成本有多高?和/或,性能和标准化之间的权衡是什么?

    我发现了一个类似的线程 但它并没有真正抓住我想要问的本质 所以我创建了一个新线程 我知道规范化和性能之间存在权衡 我想知道划定这条线的最佳实践是什么 在我的特定情况下 我有一个消息传递系统 它具有三个不同的表 messages thread
  • 有效地从 2 个数据帧中查找日期时间范围的重叠

    关于查找日期或时间范围的重叠存在一些问题 例如 https stackoverflow com questions 9044084 efficient date range overlap calculation in python 我用这
  • 使用 Numba 加速矢量距离计算

    以下是我为 3 D 环形几何中的距离 平方 计算编写的一些函数 用于该 3 D 空间中的粒子集合 import itertools import time import numpy as np import scipy import num
  • 如何防止Googlebot淹没网站?

    我正在中间的专用服务器上运行一个内容很多但流量很少的网站 有时 Googlebot 会踩踏我们 导致 Apache 耗尽内存 导致服务器崩溃 我怎样才能避免这种情况 在谷歌网站管理员工具上注册 验证您的网站并限制谷歌机器人 提交站点地图 阅
  • 您可以从 MethodInfo 对象获取 Func (或类似的)吗?

    我意识到 一般来说 使用反射会对性能产生影响 实际上 我本人根本不喜欢反思 这纯粹是学术问题 假设存在一些如下所示的类 public class MyClass public string GetName return My Name 请耐
  • 为什么直接内存“数组”的清除速度比通常的 Java 数组慢?

    我建立了一个 JMH 基准来衡量什么会更快Arrays fill与空 System arraycopy从空数组中 将 DirectByteBuffer 归零或将unsafe内存块试图回答这个问题question https stackove
  • 慢 Eclipse Spring STS 插件

    我是 Spring 新手 安装了 Eclipse STS 插件 使用服务似乎非常慢 CPU 使用率激增 笔记本电脑只会变热 实际上风扇就像喷气发动机一样运行 直接响应服务的启动 停止 虽然下面的内容确实为我解决了 Spring STS 的所
  • 使用map.get()时使用java Map.containsKey()是多余的

    一段时间以来 我一直想知道在最佳实践中是否允许避免使用containsKey 方法上java util Map而是对结果进行空检查get 我的理由是 两次查找值似乎是多余的 首先是查找containsKey 然后再次为get 另一方面 大多
  • 去除字符串的最佳方法是什么?

    我需要具有最佳性能的想法来删除 过滤字符串 I have string Input view 512 3 159 删除 view 和 的最佳性能方法是什么 和引号 我可以做这个 Input Input Replace view Replac
  • C# 写入文件的性能

    我的情况概述 我的任务是从文件中读取字符串 并将它们重新格式化为更有用的格式 重新格式化输入后 我必须将其写入输出文件 这是必须完成的操作的示例 文件行示例 ANO 2010 CPF 17834368168 YEARS 2010 2009
  • IEnumerable 作为 DataTable 性能问题

    我有以下扩展 它生成一个DataTable从一个IEnumerable public static DataTable AsDataTable
  • 对于双核手机,availableProcessors() 返回 1

    我最近购买了一部 Moto Atrix 2 手机 当我尝试查看手机中的处理器规格时 Runtime getRuntime availableProcessors 返回 1 proc cpuinfo 也仅包含有关处理器 0 的信息 出于好奇
  • 磁盘寻道时间测量方法

    我编写了一个脚本来测量 HDD 上的寻道时间 并且其完成方式的微小变化会导致显着不同的时间 第一个周期在磁盘开头的区域内进行跳转 第二个周期选择磁盘上执行查找的随机区域 相同大小 这种方法显然不同 但我不明白为什么它会改变结果 请注意 对于
  • jQuery mousemove 性能 - 节流事件?

    我们面临着与 mousemove 连接的 jQuery 事件传播性能问题 我们有一个屏幕填充画布 需要跟踪用户是否在其上拖动鼠标 因此我们在该对象上添加了一个鼠标移动侦听器 如下所示 ourCanvas on mousemove funct
  • 使用 enum.values() 与字符串数组相比,性能是否会受到影响?

    我正在使用枚举来替换String我的 java 应用程序 JRE 1 5 中的常量 当我在不断调用的方法中将枚举视为名称的静态数组时 例如 在渲染 UI 时 是否会对性能造成影响 我的代码看起来有点像这样 public String get
  • Java 11 中使用堆栈跟踪的速度明显慢于 Java 8

    我正在比较 JDK 8 和 11 的性能jmh https openjdk java net projects code tools jmh 1 21 当我遇到一些令人惊讶的数字时 Java version 1 8 0 192 vendor

随机推荐

  • 角度构建index.html不工作

    I have taken the build of angular project and got dist folder when i am trying to open the index html in browser I am ge
  • jqGrid 格式化程序和可排序列 - 不排序

    我正在为 jqGrid columnModel 使用自定义格式化程序 但无法使用格式化程序函数进行排序 如果我删除格式化程序列排序正常 jQuery listAgentOptions jqGrid height 240 datatype l
  • 可编码的失败初始化器

    我正在尝试解析以下项目数组的 json 模式 itemID 可能不为空 如何使项目的 ID 为零itemIDJSON 中不存在 itemID 123 itemTitle Hello 我的可解码类如下 public struct Item N
  • 我的所有视图控制器中都包含 AdMob 吗?

    我已经实施了 AdMob 一切似乎都正常 但我想知道 如何将横幅放入所有视图控制器中 目前 我仅在 RootViewController 上有横幅 我总共有 4 个视图控制器 Thanks 你想要的是一个GADBannerView各种单身人
  • 如何在spring 3.0中注册自定义PersistenceAnnotationBeanPostProcessor

    我想重写 PersistenceAnnotationBeanPostProcessor 它在插入 context component scan 标记后立即注册 我尝试注册一个同名的 bean 但 spring 仍然注册原始的后处理器 bea
  • 在 Eclipse Indigo 中运行 MPJ Express 时出现“未解决的编译问题”

    我遵循了 Youtube 上关于如何在 IDE 中使用 MPJ Express 运行并行应用程序的教程 我下载了最新版本的 MPJ Express 并使用了 Eclipse Indigo 我确实在我的项目 JAR 文件中包含了 MPI 当我
  • FXML 文档的 Netbeans 8.2 自动完成始终显示“无建议”

    我第一次在 Netbeans 8 2 中创建 JavaFX 项目 FXML 文档的自动完成功能始终显示 无建议 例如 我见过类似的问题 例如Netbeans7 1 和 JavaFX 2 0 FXML 代码完成不起作用 https stack
  • Gradle 6.0 打破了源集依赖

    我在这里为学生收集了一些课程 https github com emign engineEmi Lektionen tree master https github com emign engineEmi Lektionen tree ma
  • 在左下角/右下角创建两个按钮

    JButton button1 new JButton Button 1 JButton button2 new JButton Button 2 JFrame frame new JFrame frame getContentPane s
  • 引用 github 存储库中的 .css 文件作为 .html 文件中的样式表

    我在 github 上有一个存储库 其中有一个 css 文件 有什么方法可以让 github 以我可以在网页中使用它的方式提供该文件吗 换句话说 我希望能够从本地计算机或实时域上的 HTML 文件直接引用 github 上的此源文件 就像是
  • Java 中的贪吃蛇游戏,但我的重启按钮不起作用

    我的游戏重启按钮不起作用 点击它时它会倍增 我不太了解 Java 我认为自己很好 游戏主要内容 package snake game public class snake public static void main String arg
  • 选择各种嵌套容器中的最后一个元素

    如何选择 CSS 中最后一个也是最深的元素 有没有办法改进这个CSS代码 对于深树 您提出什么解决方案 15 25 我避免使用 JavaScript 但 SASS 解决方案是受欢迎的 也许使用 for level 1 div case gt
  • Dispatcher.BeginInvoke 问题

    我收到此代码的 非静态字段 方法或属性 System Windows Threading Dispatcher BeginInvoke System Action 需要对象引用 private void ResponseCompleted
  • 使用 AutoCloseable 关闭多个资源(try-with-resources)

    我知道 如果资源实现了 AutoCloseable 则您尝试传递的资源将自动关闭 到目前为止 一切都很好 但是 当我有多个想要自动关闭的资源时 我该怎么办 套接字示例 try Socket socket new Socket input n
  • 命名空间对性能有害吗? (PHP)

    我对 php 框架进行了一些更改以支持名称空间 但结果并不符合预期 对于简单的测试 主要加载框架类 执行时间减慢了约 10 根据您的经验 在大型应用程序上使用命名空间是否值得 考虑PHP的实际开发水平 已接受的答案php 命名空间基准测试
  • AWS将elb的8000端口转发到EC2的8000端口

    我有一个 ELB 其中在目标组中注册了多个 EC2 实例 我正在使用一个运行正常的 php 应用程序端口 它有 SSL 我想将端口 8000 用于我的节点应用程序 我想做的是将 my elb address 8000 转发到 any ec2
  • 根据元组的值对Python中的元组进行排序[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下代码打印最常见的 10 个单词 但是 它不起作用 关于如何修复它有什么想法吗 def reducer count words self word counts send all num occu
  • 关于搜索引擎抓取我应该了解什么?

    我指的不是 SEO 的事情 我应该知道什么 例如 引擎运行 JavaScript 吗 他们使用cookies吗 cookie 是否会跨爬行会话进行 例如今天的 cookie 和下周或下个月的爬行 选定的 JS 过滤器是否因某种原因未加载 例
  • 请解释一下该程序中的逗号运算符

    请解释一下该程序的输出 int main int a b c d a 10 b 20 c a b d a b printf nC d c printf nD d d 我得到的输出是 C 10 D 20 我的疑问是 运算符在这里做什么 我使用
  • B 树与二叉树

    如果我使用 b 树实现内存 RAM 搜索操作 那么与二叉树相比 它在缓存或其他一些效果方面会更好吗 我所知道的是 binary search tress O log n btrees O c log n 各种博客上对此进行了很多讨论 Alg