Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 高效top-K-PostgreSQL_Python_Algorithm_Postgresql_Sorting_Heap - Fatal编程技术网

Python 高效top-K-PostgreSQL

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

我在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 table
ORDER BY col
LIMIT k
from heapq import nsmallest
nsmallest(k, arr)

哪个是O(N logK)使用最小堆?

事先在列上创建索引(例如,btree)将显著加快该列上的顺序。在插入过程中,您将获得一些开销,但如果在指定列上有许多相同形式的查询,这将得到回报。我在您所要求的查询(在“使用索引进行排序”下)上找到了有趣的信息/实验。

我不知道用PostgreSQL表达这一点的方法。然而,如果您事先在col上创建索引,那么您将通过基本上免费生成一个仅为O(k)的运行时来获得顺序。当然,只有当您有许多相同形式的查询包含col时,这才有意义。问题是存在浮动col,我们可以添加任意数量的行(我们可以添加值低于或高于当前最小/最大元素的行)。对不起,我不明白。您可以在具有浮点(数字)值的列上创建索引(例如,btree)。插入新行时,索引将负责排序(缺点是插入成本稍高)。