天道酬勤,学无止境

b-tree

Does any stl::set implementation not use a red-black tree?

Has anyone seen an implementation of the STL where stl::set is not implemented as a red-black tree? The reason I ask is that, in my experiments, B-2B trees outperform stl::set (and other red-black tree implementations) by a factor of 2 to 4 depending on the value of B. I'm curious if there is a compelling reason to use red-black trees when there appear to be faster data structures available.

2021-06-15 13:43:27    分类:问答    c++   data-structures   stl   b-tree   red-black-tree

Finding the height of the B-Tree of a table in SQL Server

Since database data is organized in 8k pages in a B-tree, and likewise for PK information information, it should be possible for each table in the database to calculate the height of the B-Tree. Thus revealing how many jumps it takes to reach certain data. Since both row size and PK size is of great importance, it is difficult to calculate since eg varchar(250) need not take up 250 bytes. 1) Is there a way to get the info out of SQL Server? 2) if not, is it possible to give a rough estimate using some code analyzing the tables of the db?

2021-06-15 04:22:23    分类:问答    sql-server   sql-server-2008   primary-key   b-tree   b-tree-index

Java 中 Btree 或 B+tree 的现有实现 [关闭](Existing implementation of Btree or B+tree in Java [closed])

问题 关闭。 此问题不符合 Stack Overflow 准则。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 7年前关闭。 改进这个问题 我正在做一个需要 btree 或 b+tree 数据结构的项目。 有谁知道 btree 或 b+tree 的现有实现(带有插入、删除、搜索算法)? 它应该接受字符串作为输入并形成这些字符串的 btree 或 b+tree。 回答1 由于缺乏有关您需要解决的问题的详细信息,我将允许自己提出可能解决您的问题的替代解决方案:改用红/黑树。 红/黑树可以被认为是一个 b 树,如 Wikipedia 上所解释的: 红黑树在结构上类似于 4 阶 B 树,其中每个节点可以包含 1 到 3 个值和(相应地)2 到 4 个子指针。 在这样的 B 树中,每个节点将只包含一个与红黑树的黑色节点中的值匹配的值,在同一节点之前和/或之后有一个可选值,两者都匹配红黑树的一个等效红色节点红黑树 [...] Java 有两个内置类,TreeMap 和 TreeSet,提供红/黑树。 这些都不会将字符串作为输入并从中生长一棵树,但是您可能能够“围绕”其中一个类实现类似的东西。 回答2 jdbm 有一个非常可靠的 b+tree 实现。 还有 h+tree,这是一个有趣的相关数据结构。 回答3 我不得不实现自己的代码并开源。

2021-06-12 11:32:07    分类:技术分享    java   data-structures   b-tree

n 阶 B 树可以容纳多少个元素?(How many elements can be held in a B-tree of order n?)

问题 是2n吗? 只是检查。 回答1 术语 B 树的顺序在文献中经常被定义。 (例如参见维基百科关于 B 树的文章的术语部分) 一些作者认为它是非叶节点可以持有的最小密钥数,而其他人认为它是非叶节点可以持有的最大子节点数(比最大密钥数多一个,例如一个节点可以容纳)。 然而,许多其他人通过假设一个固定长度的键(和固定大小的节点)来避免歧义,这使得最小值和最大值相同,因此顺序的两个定义产生相差 1 的值(如所述键的数量是总是比孩子的数量少一。) 我将深度定义为在叶记录的搜索路径中找到的节点数,包括根节点和叶节点。 从这个意义上说,只有一个根节点直接指向叶节点的非常浅的树的深度为 2。如果该树要生长并需要中间级别的非叶节点,则其深度将为 3,以此类推。 在 n 阶 B 树中可以容纳多少个元素? 假设固定长度的键,并假设“顺序”n被定义为最大子节点数,答案是: (Average Number of elements that fit in one Leaf-node) * n ^ (depth - 1) 我怎么看?...: 数据(“元素”)仅保存在叶节点中。 所以持有的元素数量是一个节点中元素的平均数量乘以叶节点的数量。 叶节点的数量本身由适合非叶节点(顺序)的子节点的数量决定。 例如,叶节点正上方的非叶节点指向 n 个(顺序)叶节点。 然后,此非叶节点上方的非叶节点指向 n 个相似节点等

2021-06-12 11:25:28    分类:技术分享    b-tree

C/C++:如何将数据存储在 B 树的文件中(C/C++: How to store data in a file in B tree)

问题 在我看来,将数据作为文件存储在 B 树中的一种方法可以通过 C 使用带有结构序列(数组)的二进制文件有效地完成,每个结构代表一个节点。 因此,可以使用类似于使用数组创建链表的方法连接各个节点。 但是随之而来的问题是删除一个节点,因为在一个巨大的文件中只删除中间的几个字节是不可能的。 删除的一种方法可能是跟踪“空”节点,直到达到阈值截止,然后制作另一个文件来丢弃空节点。 但这很乏味。 从简单/效率的角度来看,是否有更好的方法来删除或什至在文件中表示 B 树? TIA, -Sviiya 回答1 我做了一个非常快速的搜索并挖出了这个:http://people.csail.mit.edu/jaffer/WB C 来源:http://cvs.savannah.gnu.org/viewvc/wb/wb/c/ -它似乎提供了基于磁盘的 B 树样式数据库——尽管查看“delete.c”似乎暗示如果你删除一个节点,它的所有内容都会被删除——如果这是正确的行为,那么它听起来像可能有帮助的东西? 另外 - B 树经常用于文件系统 - 你能不看看一些文件系统代码吗? 我自己的倾向是文件系统——如果你有一个固定大小的 B 树,每当你“删除”一个节点而不是试图删除引用时,只需将值设置为在你的代码中没有任何意义的值。 然后,运行一个清理线程来检查是否有人打开了文件以供读取

2021-06-11 14:02:34    分类:技术分享    c++   c   file   b-tree

为什么 CouchDB 使用仅追加的 B+ 树而不是 HAMT(Why does CouchDB use an append-only B+ tree and not a HAMT)

问题 我正在阅读数据结构,尤其是不可变的数据结构,例如 CouchDB 中使用的仅附加 B+ 树以及 Clojure 和其他一些函数式编程语言中使用的哈希数组映射树。 在内存中运行良好的数据结构在磁盘上运行良好的主要原因似乎是由于碎片而花费在磁盘查找上的时间,就像普通的二叉树一样。 但是,HAMT 也很浅,因此不需要比 B 树更多的搜索。 另一个建议的原因是从数组映射的树中删除比从 B 树中删除更昂贵。 这是基于我们谈论的是稠密向量的假设,并且在用作哈希映射时不适用。 更重要的是,似乎 B 树进行了更多的重新平衡,因此以仅附加的方式使用它会产生更多的垃圾。 那么为什么 CouchDB 和几乎所有其他数据库和文件系统都使用 B 树呢? [编辑] 分形树? 日志结构合并树? 头脑=吹 [编辑] 现实生活中的 B 树使用数以千计的度数,而 HAMT 的度数为 32。1024 度的 HAMT 是可能的,但由于 popcnt 一次处理 32 或 64 位,因此速度较慢。 回答1 使用 B 树是因为它们是一种易于理解的算法,可以实现“理想的”排序顺序读取成本。 因为键是排序的,所以移动到下一个或上一个键非常便宜。 HAMT 或其他哈希存储,以随机顺序存储密钥。 键是通过它们的确切值来检索的,并且没有找到下一个或上一个键的有效方法。 关于度数,通常是通过选择页面大小来间接选择的。 HAMT

2021-06-11 08:30:02    分类:技术分享    clojure   couchdb   immutability   b-tree

您应该以什么顺序将一组已知键插入 B 树以获得最小高度?(In what order should you insert a set of known keys into a B-Tree to get minimal height?)

问题 给定固定数量的键或值(存储在数组或某些数据结构中)和 b 树的顺序,我们能否确定将生成空间高效 b 树的插入键的顺序。 为了举例说明,考虑 3 阶 b 树。让键为 {1,2,3,4,5,6,7}。 按以下顺序将元素插入树中 for(int i=1 ;i<8; ++i) { tree.push(i); } 会创建一个这样的树 4 2 6 1 3 5 7 见 http://en.wikipedia.org/wiki/B-tree 但是以这种方式插入元素 flag = true; for(int i=1,j=7; i<8; ++i,--j) { if(flag) { tree.push(i); flag = false; } else { tree.push(j); flag = true; } } 创建一个这样的树 3 5 1 2 4 6 7 我们可以看到水平下降。 那么有没有一种特殊的方法来确定插入的顺序,这会减少空间消耗? 回答1 以下技巧应该适用于大多数有序搜索树,假设要插入的数据是整数1..n 。 考虑您的整数键的二进制表示 - 对于 1..7 (用点表示零)那是... Bit : 210 1 : ..1 2 : .1. 3 : .11 4 : 1.. 5 : 1.1 6 : 11. 7 : 111 位 2 变化最少,位 0 变化最频繁。 这与我们想要的相反

2021-06-10 02:34:53    分类:技术分享    algorithm   data-structures   b-tree

什么时候选择RB树、B-Tree或AVL树?(When to choose RB tree, B-Tree or AVL tree?)

问题 作为程序员,我什么时候应该考虑使用 RB 树、B 树或 AVL 树? 在决定选择之前需要考虑哪些关键点? 有人可以为每个树结构解释一个场景,为什么会参考关键点选择它而不是其他树结构吗? 回答1 用一撮盐把这个拿走: 当您管理超过数千个项目并从磁盘或某些慢速存储介质对它们进行分页时,请使用 B 树。 RB 树,当您在树上进行相当频繁的插入、删除和检索时。 当您的插入和删除相对于您的检索不频繁时的 AVL 树。 回答2 我认为 B+ 树是一种很好的通用有序容器数据结构,即使在主内存中也是如此。 即使虚拟内存不是问题,缓存友好性通常也是问题,并且 B+ 树特别适合顺序访问 - 与链表相同的渐进性能,但缓存友好性接近于简单数组。 所有这些和 O(log n) 搜索、插入和删除。 但是,B+ 树确实存在问题——例如,当您执行插入/删除操作时,项目在节点内移动,使指向这些项目的指针无效。 我有一个执行“游标维护”的容器库 - 游标将自身附加到它们当前在链表中引用的叶节点,因此它们可以自动修复或失效。 由于很少有超过一两个游标,因此它运行良好 - 但仍然需要额外的工作。 另一件事是 B+ 树本质上就是这样。 我想您可以根据您是否需要它们来剥离或重新创建非叶节点,但是使用二叉树节点可以获得更大的灵活性。 二叉树可以转换为链表并返回而无需复制节点 - 您只需更改指针

2021-06-10 01:58:06    分类:技术分享    data-structures   tree   b-tree   avl-tree   red-black-tree

javascript二叉搜索树实现[关闭](javascript binary search tree implementation [closed])

问题 关闭。 此问题不符合 Stack Overflow 准则。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 1 年前关闭。 改进这个问题 任何人都知道在 Javascript 中实现简单 BTree 的任何好的例子? 我有一堆随机到达的“东西”,并希望有效地插入每个东西。 最终,每个新的都将根据它在树中的位置插入到 DOM 中。 我可以从头开始编写代码,但不想重新发明任何轮子。 谢谢 回答1 这有帮助吗? - JavaScript 中的计算机科学:二叉搜索树,第 1 部分 回答2 如果重要的话,我发现将这种数据存储为文字树比将其存储为已经排序的数组并在数组上进行二分搜索以拼接/插入元素的效率低。 显然,JavaScript 对象的创建不是免费的。 还有 ol' encode-a-tree-in-an-array 技巧: [5, 3, 7, 1, null, 6, 9, null, null, null, null, null, null] 是相同的 5 / \ 3 7 / / \ 1 6 9 即 children(N[i]) = N[2i+1], N[2i+2] 。 我不知道这是否真的能让你在 JavaScript 中获胜。 如果您尝试一些二叉树的替代方案,您能在这里发布您的发现吗? :) 回答3 https://gist

2021-06-04 22:03:56    分类:技术分享    javascript   sorting   b-tree

Berkeleydb - B-Tree versus Hash Table

I am trying to understand what should drive the choice of the access method while using a BerkeleyDB : B-Tree versus HashTable. A Hashtable provides O(1) lookup but inserts are expensive (using Linear/Extensible hashing we get amortized O(1) for insert). But B-Trees provide log N (base B) lookup and insert times. A B-Tree can also support range queries and allow access in sorted order. Apart from these considerations what else should be factored in? If I don't need to support range queries can I just use a Hashtable access method?

2021-06-02 11:03:33    分类:问答    hashtable   berkeley-db   b-tree