从大量条目中随机详尽(非重复)选择

时间:2013-05-13 16:26:02

标签: algorithm data-structures random indexing

假设我有一个存储在关系数据库中的大型(300-500k)文本文档集合。每个文档可以属于一个或多个(最多六个)类别。我需要用户能够随机选择特定类别的文档,以便不会重复单个实体,就像StumbleUpon的工作方式一样。

我真的没有看到使用带有大量用户和文档的慢速NOT IN查询来实现这一点的方法,所以我想我可能需要为此目的实现一些自定义数据结构。也许已经有一篇论文描述了一些可能适合我需要的算法?

目前我正在考虑以下方法:

读取数据库中的所有条目 根据属于此类别的文档的ID为每个类别创建基于链接列表的索引。洗牌吧 创建一个Bloom过滤器,其中包含特定用户查看的所有条目 使用迭代器遍历索引,使用Bloom Filter随机选择项目以选择未查看的项目。

2 个答案:

答案 0 :(得分:0)

我建议使用哈希表实现。这将确保您获得恒定的时间查找。您可以实现一种称为linear probing的技术。链表是一个糟糕的实现,因为你在搜索时间吃了O(N)

如果约束是它必须是关系数据库,你可以使用诸如memcache(FB使用它)之类的东西来保持朋友问题的朋友。

答案 1 :(得分:0)

有关如何以随机顺序从数据库返回条目的信息,请参阅this answer。现在,您可以简单地跟踪用户显示的随机序列中的位置(对于每个类别)和Skip()和Take()以获取下一组记录以显示它们。您可以存储每个用户的随机XOR值,以便每个人看到不同的序列。