【问题标题】:Need an efficient selection algorithm?需要一个有效的选择算法?
【发布时间】:2012-07-07 21:38:25
【问题描述】:

我正在寻找一种算法来选择 A [N/4] 未排序数组 A 中的元素,其中 N 是数组 A 的元素数。我希望算法在次线性时间内进行选择。我有BST等基本结构的知识?哪一个对我来说是最好的算法,记住我希望它是最快的,并且对我来说实施起来不应该太难。这里 N 可以变化到 250000。任何帮助将不胜感激。注意数组可以有非独特的元素

【问题讨论】:

  • 这不是projecteuler.net的问题吗?
  • 鉴于未排序的输入,我认为你能期望的最好的就是线性复杂性。除非一个元素可以为您提供有关另一个元素的信息,否则如果您不查看所有元素,那么您未查看的元素可能就是您正在寻找的元素。对于线性时间,您正在寻找中位数算法的中位数。
  • 你能帮我实现吗,因为我找不到任何好的伪代码?
  • 维基百科或任何不错的算法书籍(例如:麻省理工学院)

标签: algorithm selection


【解决方案1】:

正如@Jerry Coffin 提到的,除非您愿意预先进行一些预处理,否则您不能希望在这里获得次线性时间算法。如果你想要一个线性时间算法来解决这个问题,你可以使用quickselect algorithm,它在预期的 O(n) 时间内运行,最坏的情况是 O(n2)。 median-of-medians algorithm 具有最坏情况的 O(n) 行为,但具有较高的常数因子。您可能会发现一种有用的算法是introselect 算法,它结合了前面的两种算法以获得具有低常数因子的最坏情况 O(n) 算法。该算法通常用于在 C++ 标准库中实现 std::nth_element 算法。

如果您愿意提前进行一些预处理,您可以将所有元素放入order statistic tree。从那时起,您可以在 O(log n) 最坏情况下查找任何 k 的第 k 个元素。不过,所需的预处理时间为 O(n log n),因此除非您进行重复查询,否则这不太可能是最佳选择。

希望这会有所帮助!

【讨论】:

  • 注意:对于订单统计树上的 O(log n),您需要平衡树。
猜你喜欢
  • 2012-12-11
  • 2011-01-24
  • 2021-12-29
  • 2017-04-21
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多