【问题标题】:Output the 10th highest number in an unsorted array [duplicate]输出未排序数组中的第 10 大数字 [重复]
【发布时间】:2012-04-15 01:40:48
【问题描述】:

可能重复:
How to find the kth largest element in an unsorted array of length n in O(n)?

如何编写算法以在大小为 n(Java 中)的未排序数组中输出 第 10 高数?

【问题讨论】:

标签: algorithm


【解决方案1】:

你正在寻找selection algorithm,它可以在O(n)的数组中找到第k个最大/最小的数字

也可以使用部分排序,或使用固定大小的最小堆k,每次将包含kth 最高的数字,并在维护此堆的同时迭代数组。

请注意,对于任意k 的一般问题,就大 O 表示法而言,最后一个解决方案 [min-heap] 的效率不如选择算法。

【讨论】:

  • 尽管如此,诚然,如果它总是第十大,这可能会严重过度解决问题。 :-)
  • 是的,所以我应该使用选择算法的哪个特定算法
  • @user:随便你。您还可以排序并仅提取最高的 10 个数字,对于硬编码的项目数量,这将是 O(n * log n) 而不是 O(n)
  • @user1305400:[指任意k]:这取决于您想要什么,如果您想要保证O(n) 最坏情况的复杂性 - 中位数解决方案的中位数是可行的方法。如果您希望在平均情况下获得良好的性能 - 我会使用 partition based selection algorithm,并且如果您想要最简单的编程,并且您已经拥有堆实现 - 堆解决方案是可行的方法。
【解决方案2】:

创建一个包含 10 个元素的数组。保持数组元素排序。

通过原始数组一次,将元素与您的数组中最小的元素进行比较 10。如果较大,则将其放入。否则继续。

【讨论】:

  • 请注意,维护此数组将需要 k 操作每个您插入的元素。我不知道它是否会比k == 10 的堆更好或更糟 - 但对于更大的k 值 - 它会开始成为一个问题。
  • 实际上,平均需要 k/2 次操作。
  • 对于 k=10 而言,将数组构建为堆不太值得。 Log 2 of 10 介于 3 和 4 之间,但操作成本更高。
  • 而您通常会插入相对于 n 的非常少的元素,因为大多数时候您正在扫描小于 10 数组中最小值的元素。
【解决方案3】:

如果数组不包含离散元素(例如包含双精度),最好的方法是使用Prune and Search 算法。如果是包含离散元素(整数) - 使用 Counting sort 并选择第 10 个元素)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2016-03-02
    • 1970-01-01
    • 2017-03-15
    相关资源
    最近更新 更多