【问题标题】:Binary Search Trees when compared to sorted linked lists与排序链表相比,二叉搜索树
【发布时间】:2015-01-25 03:38:46
【问题描述】:

如果我们将元素放在有序循环双链表中,则操作顺序(插入删除 Max Min 后继前任)与二叉搜索树相同甚至更好。那么我们为什么要使用它们呢?

是不是因为数据结构作者想通过一些简单的例子让读者熟悉树作为数据结构的一般概念?

我读过一些相同的问题,但是这些问题(不加考虑!)是用数组而不是链表询问的,而且答案对链表没有用!因为它们中的大多数都解决了移动数组中的元素以进行插入的问题。

【问题讨论】:

  • 平衡二叉搜索树的搜索效率如何?在链表中(排序与否)?
  • 搜索是:tree = sorted List = O(lg(n))

标签: data-structures binary-tree binary-search-tree


【解决方案1】:

链表不是“可寻址的”,从某种意义上说,如果你想访问链表中间的元素,例如进行二分查找,就必须遍历链表。也就是说list.get(index)的性能是O(n)。如果您使用任何能够为您提供 O(1) 性能的数据结构来备份它,那么它最终将是一个数组。然后我们会回到分配额外空间和移动元素的问题,它不如二叉搜索树高效。

【讨论】:

  • tree.get(index) 的性能也是 O(n)。以及它如何成为一个数组并且会出现分配问题?你能解释更多吗?
  • 假设一个平衡的 BST,根是所有元素的中间,你不需要走到它——它是树的起点。
  • 现在我们来看一个数组。它是可寻址的,因为它是一块连续的内存。到达第 n 个元素的复杂度为 O(1),因为可以一步计算地址:第 n 个元素的地址是数组的地址加上指针大小的 n 倍。你会因为能够做到这一点而受到惩罚。它不是动态的。它必须事先分配。您必须事先知道集合的大小。
  • 向数组用户隐藏问题的常用技巧是分配一些额外空间,当接近限制时,分配一个更大的数组并复制所有元素。这个技巧有时可能很昂贵。我在我的职业生涯中目睹了 Java 的 ArrayList 在循环中被这样滥用并导致应用程序崩溃。
  • 但是您没有提到例如,如果您想在平衡二叉搜索树中访问 Max,它将是 O(log(n)) (Min 也是如此),但是双循环链表可以在 O(1) 中访问它们。我只是在谈论上面提到的操作。如果你想经常访问数组列表中间的元素,你可以简单地有一个指针!我的意思是链接列表在做同样的工作(也许更好),但编码的复杂性更低!
【解决方案2】:

实际上,双循环链表中的二分查找无法完成,因为在二分查找中我们需要中间元素,但我们无法访问链表中的中间元素,除非我们支付 theta(n/2) 等等(half前半部分 (1/4) 或后半部分 (3/4) ) 。

但是制作二叉搜索树的想法源于这个想法。我们几乎保留了数据的每个部分的中间,以将其用于搜索和其他目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多