【问题标题】:What is difference between Array and Binary search tree in efficiency?数组和二叉搜索树在效率上有什么区别?
【发布时间】:2012-01-28 15:15:46
【问题描述】:

我想知道什么是最好的:数组或二进制搜索树(插入、删除、查找最大值和最小值)以及如何改进它们?

【问题讨论】:

  • 您是否尝试搜索此信息?应该很容易找到。
  • 你的意思是抽象数据结构linked listbinary search tree吗?
  • 以什么方式改进?最适合什么?这些是完全不同的数据结构,它们中的每一个都可能是某个应用程序的“最佳”。

标签: arrays algorithm binary-search-tree processing-efficiency


【解决方案1】:

数组 允许random access 指向其中的每个元素。因此您可以在O(1) 中插入、删除和查找特定元素,并在O(n) 中查找最大/最小、删除。 [您也可以设置 max/min O(1) 并删除 O(n) ]。如果您保持数组排序,它将导致插入/删除为O(n),但您将获得O(logn) find 和O(1) min/max。

BST 是按定义排序的,对于常规的 [不平衡] BST,您会得到 O(n) 最坏情况的行为。对于平衡 BST,您会得到 O(logn) insert/delete/find。您可以获得O(1) min/max 两者的任何方式。

数组通常也比iterate 更快[假设迭代顺序不重要],因为您可以获得更好的cache 性能。此外,与 BST 不同 - 它本质上具有无限大小,数组需要在数组已满时重新分配和复制数据。

改进 BST 可以通过将其设为balanced 来完成 - 比如AVLred-black-trees

哪个更好?这取决于应用程序。通常,当您计划插入数据并对其进行排序时,将首选 BST。如果随机访问或迭代是主要目的:您通常使用数组。

【讨论】:

  • 为什么 findMin/findMax 常量操作 O(1) 是为了平衡 BST?
  • @user384706:每当您从平衡 BST 中插入/删除元素时,它是 O(logn)O(n) 用于非平衡 BST。您可以维护额外的指针minmax,仅当您从 BST 插入/删除元素时才会修改它们。找到新的最大值/最小值是 O(logn) 平衡 BST 和 O(n) 非平衡 - 因此在此操作中没有性能损失[大 O 项],就大 O 而言,您可以将这些指针维护为“免费”
  • 啊,所以你的意思是使用额外的指针。但在这种情况下,这是一个与 BST 算法没有直接关系的优化。所以在与另一个比较时声称是不是有点不一致/误导max/minO(1) 的数据结构(在这种情况下是一个数组),因为它不是默认的?必须实现它以使其成为
  • @user384706:我明确表示你可以得到它:You can get O(1) min/max any how for both. 这个想法是这个增强在大 O 表示法方面是“免费的” - 如果你需要最小/最大:没有理由不这样做。但是,与非排序数组相比[本线程的主题]:您不能同时进行 O(1) 插入和 O(1) min/max ,因此重要的是要提及您 can 获得O(1) max/min with BST for "free"。
  • 感谢您向我解释这一点。+1 由我
【解决方案2】:

数组和二叉搜索树的性能比较:

                 Array                     Binary search tree
          Unsorted   Sorted           Average            Worst case
Space      O(n)       O(n)             O(n)               O(n)
Search     O(n)       O(log n) *       O(log n)           O(n)
Max/Min    O(n)       O(1)             O(1) **            O(1) **
Insert     O(1)       O(n)             O(log n)           O(n)
Delete     O(1)       O(n)             O(log n)           O(n)

*假设二分查找

** 需要额外的 min 和 max 指针,否则为 O(log n)

【讨论】:

  • 为什么O(1) 是 BST 的查找最大值/最小值?
  • 既然你问了,我不确定它是否正确。二叉搜索树按定义排序,但是(取决于实现?)可能无法在 O(1) 中获得最小值/最大值。在这种情况下,它将改为 O(log n)。
  • 它不是O(1),除非您的实现保留指向minmax 值的指针。还要检查amit 答案中的cmets
猜你喜欢
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2018-09-19
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多