algorithm - top-k选择/合并

标签 algorithm database-design

我有 n 个排序列表(5 < n < 300)。这些列表很长(300000 多个元组)。选择单个列表的前 k 个当然是微不足道的——它们就在列表的开头。

k = 2 的示例:

top2 (L1: [ 'a': 10, 'b': 4, 'c':3 ]) = ['a':10 'b':4]
top2 (L2: [ 'c': 5, 'b': 2, 'a':0 ]) = ['c':5 'b':2]

当我想要所有排序列表中的前 k 个组合时变得更有趣。

top2(L1+L2) = ['a':10, 'c':8]

仅组合单个列表的前 k 个不一定会给出正确的结果:

top2(top2(L1)+top2(L2)) = ['a':10, 'b':6]

目标是减少所需空间并保持排序后的列表较小。

top2(topX(L1)+topX(L2)) = ['a':10, 'c':8]

问题是是否有一种算法可以计算出在某个位置切掉列表的长尾的同时具有正确顺序的组合top k。如果存在:如何找到可以安全切割的极限 X?

注意:正确的计数并不重要。只有顺序是。

top2(magic([L1,L2])) = ['a', 'c']

最佳答案

此算法使用 O(U) 内存,其中 U 是唯一键的数量。我怀疑是否可以实现较低的内存界限,因为在所有 key 已求和。

  1. 制作一个包含 (key:total_count) 个元组的主列表。只需一次遍历每个列表中的一项,记录每个键出现的次数。
  2. 使用任何 top-k selection algorithm在不使用额外内存的主列表上。一个简单的解决方案是就地对列表进行排序。

关于algorithm - top-k选择/合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2878348/

相关文章:

c - 查找二叉树中最左边的节点

python - 快速查找给定向量的字典向量。高维度

mysql - 将连接查询转换为嵌套查询

php - 关系的数据库设计问题

php - 数据库结构(mysql): How to manage the set of specifications for every subcategory?

algorithm - 使用置换矩阵对稀疏矩阵进行 Cholesky 分解

java - 对数算法

algorithm - 有没有一种有效的方法来计算节点图上的热图之类的东西?

oracle - 得到一个名为保留字的Oracle表,可能会出现哪些问题?

MySQL预订网站: query/db optimization