【问题标题】:Searching a Min Binary Heap搜索最小二叉堆
【发布时间】:2014-04-28 23:24:20
【问题描述】:

我必须简单地提出一种算法,而不是用代码,而是用文字来找到最小二进制堆中的最大值。我认为,因为最小二进制堆在底部包含最高值,所以如果您从索引的末尾而不是开头开始搜索,您会立即找到它,而不是从头开始搜索。这在实践和理论中是否有意义?谢谢!

【问题讨论】:

  • 底部表示最高索引号。如果最小堆在索引 0 处包含 2,在索引 30 处包含 100。那么,如果您从索引 30 开始搜索,您会比从索引 0 开始更快地找到该术语。

标签: java algorithm logic heap


【解决方案1】:

以下是最小二叉堆:

        1
   2        5
3     4

只是指出,尽管保证最大值是叶子,但并非所有叶子都必须位于树的最低级别。

【讨论】:

    【解决方案2】:

    二叉堆包含 ~n/2 叶,其中n 是堆中元素的总数,实际上其中一个将是最大值。

    但是,您必须遍历所有这些才能找到最大值,因此您收到的加速比只有 *2,使用这种方法仍然是O(n)

    【讨论】:

      【解决方案3】:

      以下是最小二进制堆:

              1
          2       3
       10    5  20    7
      

      “最大值”可以在叶子中任何地方

      如果您在索引末尾而不是 开始时,您会立即找到它,而不是从 开始。

      这是不正确的。

      可以跳过非叶子,但这对渐近复杂性没有帮助,因为具有n 元素的堆大约有n/2 叶子。简单的线性扫描就可以了。

      【讨论】:

        【解决方案4】:

        二叉堆的结构是一棵平衡树。在内部,它可以表示为节点树或数组。

        如果它表示为一棵树,你别无选择,只能遍历所有节点到叶子,这是一个 O(n) 解决方案,除非你有叶子的引用。

        如果它被表示为一个数组,你可以做得更好。请注意,元素 k 的 2 个子元素分别位于 2k 和 2k+1 处。这意味着您可以查看数组的末端并向后走。这会更快,但仍然是 O(n)

        【讨论】:

          【解决方案5】:

          如果堆的大小为n,则需要从索引n-1到(n-1)/2搜索。这些数字中的最大值将为您提供最大数字。

          从字面上看,您必须搜索所有叶节点以找出最大的数字。这是一个 O(n/2) 或 O(n) 操作。

          【讨论】:

          • 我相信范围是n-1(n-1)/2。给定一个大小为n 的基于数组的堆,如果2*p+1 >= n,则索引p 处的节点是叶节点。求解p 得到p = (n-1)/2
          猜你喜欢
          • 2019-02-21
          • 2015-06-25
          • 1970-01-01
          • 2011-06-25
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 2014-11-10
          相关资源
          最近更新 更多