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