"在n + 2k-3比较中找到大小数组中的第三大元素(2 ^ k +1)。"
这是我在算法课程期末考试中遇到的一个问题,我没有得到所有的分数。在彻底的互联网搜索之后,我不确定什么是正确的答案。
我意识到它是第二大问题的同一问题的扩展版本,但是所要求的紧密比较限制使问题变得棘手。 我还找到了一个数学解释来找到第K个元素here,但是这对我来说太复杂了。
将数组大小表示为n = 2 ^ k + 1.
在考试中,我的答案是这样的:
我们将使用锦标赛树。首先,我们遗漏了一个任意元素 然后构建由2 ^ k个元素组成的树。因此树中有K个级别(log(2 ^ k))。
找到胜利者将进行n-2次比较。
找到输给胜利者的人中最大的元素。 (K-1 comp。)
找到输给决赛失败者的最大元素。 (K-2 comp。)
我们将这些与我们在开始时遗漏的那些进行比较。 (2 comp。)
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被采取..)。
提前致谢, 伊泰
答案 0 :(得分:1)
在n - 1 = 2 k 上构建一个锦标赛树,任意选择。 (n - 2比较)
在叶子上,用未选择的元素替换所选元素的最大值。重建锦标赛树。 (k比较)
将丢失的最大元素设置为新的最大值,如第二大算法中所示。 (k - 1比较)
我将正确性证明作为练习。