1

“在 n+2k-3 个比较中找到大小为 (2^k +1) 的数组中的第三大元素。”

这是我在算法课程期末考试中遇到的一个问题,我没有得到所有的分数。经过彻底的互联网搜索,我仍然不确定正确的答案是什么。

我意识到这是第二大问题的扩展版本,但是所要求的严格比较界限使问题变得棘手。我还找到了一个数学解释来在这里找到第 K 个元素,但是这对我来说太复杂了,我无法理解。

将数组大小表示为 n = 2^k + 1。

在考试本身中,我的答案是这样的:

我们将使用锦标赛树。首先,我们遗漏了一个任意元素。
然后构建由 2^k 个元素组成的树。因此树中有 K 个级别 (log(2^k))。

找到获胜者将需要我们进行 n-2 次比较。

在输给获胜者的人中找到最大的元素。(K-1 补偿)

在输给决赛输家的人中找到最大的元素。(K-2 补偿)

我们将比较这些和我们一开始遗漏的那个。(2个补偿)

3 个中最大的是数组中的第 3 个。

比较总数:n - 2 + k - 1 + k - 2 + 2 = n + 2k - 3。

满分 25 分,我得了 10 分。

我犯了2个错误。主要的是,如果所需的元素在获胜者的子树中,我的答案将是不正确的。此外,正确答案应该是我最后比较的 3 个中的第二大。

我发现的另一个算法如下: -
构建锦标赛树并找到获胜者 (n - 2) -
通过将所有失败者与获胜者进行比较来找到第二大的。(也通过锦标赛树)(k - 1)
- 答案在于最大的输家到第二大的输家,以及在第一棵树的决赛中输掉的输家。(log(k+1) + K-1-1)

- 这个解决方案假设我们遗漏的元素不是数组中最大的。如果是,我不确定它是如何起作用的。另外,我可能没有正确理解比较次数。

我很高兴知道是否有更好的解释算法。我也很想知道是否有更多关于 L-th 大的广义的(K 被取了..)。

提前致谢, Itay

4

1 回答 1

1
  1. 在任意选择的n - 1 = 2 k个元素上构建锦标赛树。(n - 2 个比较)

  2. 在叶子上,用未选择的元素替换已选择元素的最大值。重建锦标赛树。(k 个比较)

  3. 将丢失的元素中的最大值取到新的最大值,如第二大的算法。(k - 1 个比较)

我将把正确性证明留作练习。

于 2016-08-02T02:56:53.137 回答