在 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) 的数组中的第三大元素的主要内容,如果未能解决你的问题,请参考以下文章
长度为n的顺序表顺序查找时,当查找成功时候的平均查找长度为多少,不成功时又是多少?
python面试题-输入一个由n个大小写字母组成的字符,按Ascii码值从小到大排序,查找字符串中第k个最小Ascii码值的字母