数据结构允许基于标签的高效查找


11

我正在寻找一种类似于以下内容的高效数据结构来存储数据。

ID标签Order1 Order2 
--------------------------
1 1,2 1 1
2 2,5 2 3
3 1,7 4 7
4 6 3 0

我需要能够以这样的方式来查询这个结构,它会给我含标签表达式中的所有ID的列表-支持ANDORNOT操作。例如。(((1或2)而不是7)

我还需要能够指定结果的顺序(Order1或Order2),并且能够指定带有可选偏移量的最大返回行数。获取前30-100个结果的性能至关重要。

最后,我需要一种便宜的方法来查找“标签关系”,例如,我想知道哪些标签与标签(1或2)“相关”以及以什么频率“关联”。表示哪些标签与1 OR 2 ...出现在同一集合中,并按频率排序。

关于哪种数据结构(或结构集)对于此类工作会非常有效的任何想法?

(我想以此为概念证明来重新设计SE系列网站的标记页面)


1
只是一个评论(也许微不足道)。您为什么不依赖关系数据库管理系统?您可以定义带有<id,tag>对的表,并在标签列上添加索引。然后,您可以使用标准的SQL查询提取数据。RDBMS将有效地执行查询优化和输出排序的“肮脏”工作。
Marzio De Biasi

@很抱歉,表达式在大规模情况下效率极低,自连接成为噩梦般的查询。
山姆·萨弗隆

@Sam:好的。您的任务很普通,因此我认为一个好的RDBMS(带有数据挖掘工具)可以胜任。我请一位数据结构专家发言。:-)
Marzio De Biasi

我相信,允许AND,OR,NOT的所有组合将使创建不列出所有项目的数据结构变得困难(也许可以将其限制为3-CNF?)。如果不存在这样的限制,则可能只浏览记录(以指定的顺序),直到找到30-100个符合标签要求的记录。尽管总的来说,我同意Vor的建议,即使用数据库为您完成繁重的工作。
2011年

不是专家,但是我认为,如果您对询问标签的方式不加限制,那将很困难。将它们限制为CNF(如bbejot所建议)是一种方法,另一种方法是将查询可以询问的不同标签的数量限制为少量(例如6)。
卡夫

Answers:


6

这并不完全是有效数据结构的答案,而是对@bbejot和@Kaveh的评论的详尽阐述,给出了挥舞自如的论点,说明为什么在给定当前问题的情况下,我们不应该期望有比搜索主题更好的东西整个数据库。该论点是基于SAT的简化,指数时间假设和大量挥舞手法。

ñX|X|=ñXĴ=1个ĴXĴ=01个2ñķķ一种ñdØ[RñØŤñ2ñ

我们不应该期望在查询的长度上进行有效的搜索(减少为SAT)。我们也不应期望比通过指数时间假说查看数据库中的所有项目好得多。

ñ1个


好观察。每个问题最多具有5个标签,因此有关标签的查询等同于5-CNF。
卡夫

谢谢!是的,我们可以在这里进一步假设5-CNF,标记行为不是随机的。通常,人们会使用最常用的标签来标记内容,这样可以使用其他一些快捷方式。
山姆·萨弗隆

1
@Kaveh,我们最终在内存结构中滚动了一个。有一些非平凡的快捷方式,排序是一个瓶颈,使用堆排序或修改后的快速排序可让您有效地选择前N个,而无需执行完整排序。预先计算的排序使您可以更有效地选择数据透视,并在需要全面扫描时避免排序。多线程加快了选择速度。用户与结构进行交互之前,可以将大量工作推迟到后台进行。令人惊讶的是,我们的内存结构在堆栈溢出数据集上的平均搜索时间为0ms。
山姆·萨弗隆

@SamSaffron-MSO帖子详细介绍了此功能?我们这里有一个错误报告。
凯文·维米尔

5

这是一个非常简单的答案,但我认为很有效:

Map Tag ([Id],[Id])ØØGñ

Map Id (Set Tag)IdØñØG


我倾向于同意,将某些非常简单的结构(如多次假脱机的地图)也许是到达此处的最佳方法。内存很便宜和维护多个缓存不是太难
萨姆藏红花
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.