Python 高效top-K-PostgreSQL
我在PostgreSQL中有一个巨大的表,我需要获得前K个元素。 有没有办法选择O(N logK)中的前K个条目?Python 高效top-K-PostgreSQL,python,algorithm,postgresql,sorting,heap,Python,Algorithm,Postgresql,Sorting,Heap,我在PostgreSQL中有一个巨大的表,我需要获得前K个元素。 有没有办法选择O(N logK)中的前K个条目? 最明显的例子是: SELECT * FROM table ORDER BY col LIMIT k from heapq import nsmallest nsmallest(k, arr) 将给我们类似的O(N logN)解决方案 sorted(arr)[:k] # in python 有没有一种SQL方法可以使用堆来执行此操作? 如本例所示: SELECT * FROM
最明显的例子是:
SELECT *
FROM table
ORDER BY col
LIMIT k
from heapq import nsmallest
nsmallest(k, arr)
将给我们类似的O(N logN)解决方案
sorted(arr)[:k] # in python
有没有一种SQL方法可以使用堆来执行此操作?如本例所示:
SELECT *
FROM table
ORDER BY col
LIMIT k
from heapq import nsmallest
nsmallest(k, arr)
哪个是O(N logK)使用最小堆?事先在列上创建索引(例如,btree)将显著加快该列上的顺序。在插入过程中,您将获得一些开销,但如果在指定列上有许多相同形式的查询,这将得到回报。我在您所要求的查询(在“使用索引进行排序”下)上找到了有趣的信息/实验。我不知道用PostgreSQL表达这一点的方法。然而,如果您事先在col上创建索引,那么您将通过基本上免费生成一个仅为O(k)的运行时来获得顺序。当然,只有当您有许多相同形式的查询包含col时,这才有意义。问题是存在浮动col,我们可以添加任意数量的行(我们可以添加值低于或高于当前最小/最大元素的行)。对不起,我不明白。您可以在具有浮点(数字)值的列上创建索引(例如,btree)。插入新行时,索引将负责排序(缺点是插入成本稍高)。