发现,在至少物品


11

考虑个值集(表示为无重复且具有已知大小的排序数组(即,大小可以在O(1)中获得)。可以在O(1)时间内测试值的相等性。以获得中至少不同集合中存在的一组值。ķ Ñnkn

显而易见的算法是遍历所有集合,对每个值的出现次数进行计数,然后返回计数值大于。但是,在某些情况下,您可以做得更好:例如,当且一个集合比另一个集合小得多时,查看所有项并执行二进制搜索会更有效。对于每个对象:二进制搜索方法的成本为而朴素的方法的成本为,当时更糟。n = k = 2 S 1 S 2 S 1 S 2 O | S 1 | log | S 2 |O | S 1 | + | S 2 || S 1 | < < | S 2 |kn=k=2S1S2S1S2O(|S1|log(|S2|))O(|S1|+|S2|)|S1|<<|S2|

考虑到这一点,在哪些情况下我们可以比朴素的算法做得更好?(如果这是一个众所周知的问题,我很高兴知道它的通常名称并提供参考。)


3
这属于“前K个”结果或“重击手”的一般类别。后者更接近您要查找的内容。不过,该领域的大部分工作都集中在大型数据集和亚线性内存限制上。
Suresh Venkat 2012年

9
可以使您给出的“在S2中搜索S1的所有位置”方法可以在时间,至少总是与幼稚的线性时间算法一样好。O(|S1|log(|S2|/|S1|))
David Eppstein

Answers:


2

好的,我想我发现了一些相关的东西:本文在第三节(第2页)中提到了一个“ T出现问题”,这正是我们的问题(其中是我们称为),隐藏在某些特定领域的术语后面。他们提出的ScanCount算法是我在问题中提出的幼稚方法。MergeOpt算法是二进制搜索技巧的概括。他们的主要建议(DivideSkip)是此二进制搜索技巧和用于跳过多个值的其他技巧(MergeSkip)的组合。甚至在实验上似乎聪明的方法比幼稚的方法要好得多(请参阅第8页的“无过滤器”一栏,过滤器是针对特定领域的东西的启发式方法)。ķTk

这可以与David Eppstein的技巧相结合,以使多个二进制搜索更加有效,并且可以使用插值搜索而不是二进制搜索(这是同一领域另一篇论文的想法)。S2


1

您的问题类似于发现频繁项集的数据挖掘问题,也称为关联规则学习。如果我理解正确,您的问题可能会减少为找到支持 > = k的基数为1的频繁项集(即单例)。当然,该问题的可用算法(例如Apriori,Eclat,D-CLUB等)还允许确定基数> 1的频繁项集。

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.