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

Posted

技术标签:

【中文标题】在 n+2k-3 个比较中查找大小为 (2^k +1) 的数组中的第三大元素【英文标题】:Finding the 3rd largest element in array of size (2^k +1) in n+2k-3 comparisons 【发布时间】:2016-12-07 03:43:20 【问题描述】:

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

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

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

表示数组大小为 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 分。

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

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

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

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

提前致谢, 伊泰

【问题讨论】:

算法问题在这里完全有效;这就是“算法”标签的用途。 【参考方案1】:

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

    在叶子节点,用未被选中的元素替换最大的选中元素。重建锦标赛树。 (k 次比较)

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

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

【讨论】:

好的,再次感谢。给定数组大小为 2^k + 1 的情况下,您知道是否还有一种针对第 L 个最大元素的算法? @ItayR 您可以多次重复步骤 2。但是,随着 L 变大,这是次优的。

以上是关于在 n+2k-3 个比较中查找大小为 (2^k +1) 的数组中的第三大元素的主要内容,如果未能解决你的问题,请参考以下文章

如何查找无序数组中的Top n

13常见算法数组元素的区间查找

手写排序查找

长度为n的顺序表顺序查找时,当查找成功时候的平均查找长度为多少,不成功时又是多少?

python面试题-输入一个由n个大小写字母组成的字符,按Ascii码值从小到大排序,查找字符串中第k个最小Ascii码值的字母

10.N个整数中查找是否相加为K[深度搜索]