基于answer从 MongoDB 文档中,我了解到 MongoDB 能够对大型数据集进行排序,并在使用 limit() 时提供排序结果。 但是,当使用 sort() 查询相同的数据集时会导致内存异常。
从上面帖子的第二个答案中,发帖者提到整个集合被扫描、排序并返回前 N 个结果。我想知道当我使用 limit() 时集合是如何排序的。 从文档中我发现当使用 limit() 时它会进行 Top-K 排序,但是在任何地方都没有太多关于它的解释。我想看看有关 Top-K 排序算法的任何引用资料。
最佳答案
一般来说,您可以使用大小为 K 的最小堆进行高效的 top-K 排序。最小堆表示迄今为止在数据集中看到的最大 K 个元素。它还让您可以恒定时间访问那些前 K 个元素中的最小元素。
当您扫描数据集时,如果给定元素大于最小堆中的最小元素(即到目前为止最大的前 K 个元素中的最小元素),您将最小堆中的最小元素替换为该元素元素并重新堆化 (O(lg K)
)。
最后,您只剩下整个数据集中的前 K 个元素,而不必对它们全部进行排序(最坏情况下的运行时间是 O(N lg K)
) ,仅使用 Θ(K)
内存。
我实际上是在学校学到这个的:-)
关于mongodb - Top-K排序算法在MongoDB中是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42767899/