Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures T树:为什么它们不用于磁盘索引?_Data Structures - Fatal编程技术网

Data structures T树:为什么它们不用于磁盘索引?

Data structures T树:为什么它们不用于磁盘索引?,data-structures,Data Structures,我最近一直在研究B+树和T-树。似乎有一种趋势,B+树用于磁盘索引,T-树用于内存 我相信这是由于磁盘I/O,但我找不到任何东西证实这一观点。我的假设正确吗 此外,如果T-树的磁盘访问可以通过缓存限制在日志B中,那么它们在日志B N中的性能难道不能超过B+树吗?T-树本质上是一个二叉树。所以树的深度类似于T树的log2(N/B)和B+树的logB(N)(N=#数据项,B=每个节点中存储的键数=B+树的分支因子)。这些都是近似值,因为两棵树在每个节点中都没有固定数量的项。无论如何,对于大N,B+树

我最近一直在研究B+树和T-树。似乎有一种趋势,B+树用于磁盘索引,T-树用于内存

我相信这是由于磁盘I/O,但我找不到任何东西证实这一观点。我的假设正确吗


此外,如果T-树的磁盘访问可以通过缓存限制在日志B中,那么它们在日志B N中的性能难道不能超过B+树吗?

T-树本质上是一个二叉树。所以树的深度类似于T树的log2(N/B)和B+树的logB(N)(N=#数据项,B=每个节点中存储的键数=B+树的分支因子)。这些都是近似值,因为两棵树在每个节点中都没有固定数量的项。无论如何,对于大N,B+树将在该指标上轻松获胜。在统一内存访问的假设下,这个数字并不重要,但在辅助存储上它确实很重要,因为它大致相当于辅助存储访问的数量。它在具有分层内存的现代机器上也很重要(最初的T-Tree纸在Vax 11/750上测试)


我在上面对如何为各自的环境更新这两个结构进行了假设。我认为它们是对称和公平的。我主要假设数据和密钥通过引用存储在内存中,通过拷贝存储在辅助存储器中。如果不以这种方式调整结构,将对T-tree造成灾难性后果,因为每个关键比较都需要外部访问,因此T-tree的设计核心是统一的访问成本。对于非固定大小的数据,在这两种情况下都需要进行一些其他的打包调整(并在现实世界中使用)。

T-树本质上是一个二叉树。所以树的深度类似于T树的log2(N/B)和B+树的logB(N)(N=#数据项,B=每个节点中存储的键数=B+树的分支因子)。这些都是近似值,因为两棵树在每个节点中都没有固定数量的项。无论如何,对于大N,B+树将在该指标上轻松获胜。在统一内存访问的假设下,这个数字并不重要,但在辅助存储上它确实很重要,因为它大致相当于辅助存储访问的数量。它在具有分层内存的现代机器上也很重要(最初的T-Tree纸在Vax 11/750上测试)


我在上面对如何为各自的环境更新这两个结构进行了假设。我认为它们是对称和公平的。我主要假设数据和密钥通过引用存储在内存中,通过拷贝存储在辅助存储器中。如果不以这种方式调整结构,将对T-tree造成灾难性后果,因为每个关键比较都需要外部访问,因此T-tree的设计核心是统一的访问成本。对于非固定大小的数据,在这两种情况下都需要进行一些其他的打包调整(并在现实世界中使用)。

如果您通过缓存限制日志B,则实际上是说读取的节点数与索引大小无关。为了参数起见,请修正B=2,以便索引必须足够大,以便只读取最后一个节点。我认为这意味着所有内部节点都必须适合缓存。回到任意大小索引,您就有了任意大小的缓存。@DrC,您完全正确。假设只缓存每个节点的最小/最大值和子指针,这意味着B可以大得多,而树中每个节点的内存开销保持不变。假设需要64个字节来缓存每个节点的最小/最大/左/右,B=128。根据N=1024和B=128的对数(N/B),高度应为log2(1024/128)或3,共有7个节点(2^h-1)。因此,对于7个节点和每个节点64个字节,只有448个字节。因此,mem成本随着节点数而不是N的增加而增加。这导致您的结论是,只有最后一个节点在日志B处从磁盘读取。如果您通过缓存限制到日志B,那么您本质上是说读取的节点数与索引大小无关。为了参数起见,请修正B=2,以便索引必须足够大,以便只读取最后一个节点。我认为这意味着所有内部节点都必须适合缓存。回到任意大小索引,您就有了任意大小的缓存。@DrC,您完全正确。假设只缓存每个节点的最小/最大值和子指针,这意味着B可以大得多,而树中每个节点的内存开销保持不变。假设需要64个字节来缓存每个节点的最小/最大/左/右,B=128。根据N=1024和B=128的对数(N/B),高度应为log2(1024/128)或3,共有7个节点(2^h-1)。因此,对于7个节点和每个节点64个字节,只有448个字节。因此,mem成本随着节点数而不是N的增加而增加。这导致您的结论是,只有最后一个节点在日志B中从磁盘读取。