CS中的许多数据结构都是二进制的(BST、堆等)。以非二进制形式实现它们的充分理由是什么?例如,每个节点有一个包含3个子节点的堆,等等。
每个节点有两个以上子级的树是一种折衷,因为它们的深度较浅,而每个节点有更多的链接。B树通常用于数据库和文件系统,是每个节点具有多个链接的树结构的经典示例。这种结构非常适合文件系统,因为B树节点的大小可以调整为与文件系统块或集群的大小紧密匹配。
二叉树有相对较大的空间开销。例如,实现集合的二进制搜索树中的节点包含四个字段,key
、left
和right
。由于key
是您唯一真正感兴趣的东西,而left
和right
指针只是为数据结构记账,因此这是2/3的开销。
相比之下,三元搜索树节点将具有五个字段:key1
和key2
,加上指针left
、middle
和right
。这只是3/5的开销,并且对于较大的节点,开销的相对量会进一步减少。当然,在某些时候,结构会变得太大而无法管理,因此可以从较大的节点中挤出的性能是有限的;这个限制取决于应用程序。
(我甚至没有考虑内存分配造成的开销,内存分配也会随着节点变大而下降。拥有更大节点还有其他原因,例如2-3树比二进制搜索树具有更好的渐近复杂性。)
当操作是二进制的时,您将使用二进制数据结构。当操作是三进制时,您将使用三进制数据结构。二进制数据结构常见的一个原因是大多数操作都是二进制的。例如,如果你想比较4个元素,你可以一次比较2个元素。+,-,*,/
也是如此。以Java中的TreeSet或TreeMap为例,它是一棵红黑树。你为它提供了一个比较器,然后你实现了:
compare(T o1, T o2)
这是一个比较2个参数的二进制运算。