什么时候非二进制数据结构比二进制数据结构好?(如堆、BST等)



CS中的许多数据结构都是二进制的(BST、堆等)。以非二进制形式实现它们的充分理由是什么?例如,每个节点有一个包含3个子节点的堆,等等。

每个节点有两个以上子级的树是一种折衷,因为它们的深度较浅,而每个节点有更多的链接。B树通常用于数据库和文件系统,是每个节点具有多个链接的树结构的经典示例。这种结构非常适合文件系统,因为B树节点的大小可以调整为与文件系统块或集群的大小紧密匹配。

二叉树有相对较大的空间开销。例如,实现集合的二进制搜索树中的节点包含四个字段,keyleftright。由于key是您唯一真正感兴趣的东西,而leftright指针只是为数据结构记账,因此这是2/3的开销。

相比之下,三元搜索树节点将具有五个字段:key1key2,加上指针leftmiddleright。这只是3/5的开销,并且对于较大的节点,开销的相对量会进一步减少。当然,在某些时候,结构会变得太大而无法管理,因此可以从较大的节点中挤出的性能是有限的;这个限制取决于应用程序。

(我甚至没有考虑内存分配造成的开销,内存分配也会随着节点变大而下降。拥有更大节点还有其他原因,例如2-3树比二进制搜索树具有更好的渐近复杂性。)

当操作是二进制的时,您将使用二进制数据结构。当操作是三进制时,您将使用三进制数据结构。二进制数据结构常见的一个原因是大多数操作都是二进制的。例如,如果你想比较4个元素,你可以一次比较2个元素。+,-,*,/也是如此。以Java中的TreeSet或TreeMap为例,它是一棵红黑树。你为它提供了一个比较器,然后你实现了:

compare(T o1, T o2) 

这是一个比较2个参数的二进制运算。

最新更新