我正在寻找一种算法,用于在未排序的数组A中选择A [N / 4]元素,其中N是数组A的元素数。我希望算法在次线性时间内进行选择。我有对BST等基本结构的了解?哪一个对我来说是最好的算法我记得我希望它是最快的,对我来说不应该太难实现。这个N可以变化到250000.任何帮助都将受到高度赞赏。注意数组可以有非独特的元素
答案 0 :(得分:2)
正如@Jerry Coffin所提到的,你不能希望在这里得到一个次线性时间算法,除非你愿意预先做一些预处理。如果你想要一个针对这个问题的线性时间算法,你可以使用quickselect algorithm,它在预期的O(n)时间运行,其中O(n 2 )最坏情况。 median-of-medians algorithm具有最坏情况的O(n)行为,但具有高常数因子。您可能会发现一种有用的算法是introselect算法,该算法结合了前两种算法,以获得具有低常数因子的最坏情况O(n)算法。该算法通常用于在C ++标准库中实现std::nth_element
算法。
如果您愿意提前进行一些预处理,可以将所有元素放入order statistic tree。从那时起,您可以在任何k时间O(log n)最坏情况下查找第k个元素。但是,所需的预处理时间是O(n log n),因此,除非您进行重复查询,否则这不太可能是最佳选择。
希望这有帮助!