Algorithm 西部最快的布景

Algorithm 西部最快的布景,algorithm,language-agnostic,set-intersection,Algorithm,Language Agnostic,Set Intersection,我无法在一个地方找到关于这个主题的任何令人满意的报道,因此我想知道: 最快的集合相交、并集和分离算法是什么? 有没有域名有限的有趣网站? 有人能打败O(Z)吗,其中Z是交叉口的实际大小 如果你的方法依赖于排序集,请注意,但不要认为它是一个不合格的因素。在我看来,必须有一个真正的仓库来共享微妙的优化,我不想错过任何一个 我知道的一些算法依赖于超出常规的位操作,因此您可以假设SSE4的存在以及对popcount等内部函数的访问。请注意这个假设 感兴趣的: 更新 我们得到了一些非常好的部分答案,但我

我无法在一个地方找到关于这个主题的任何令人满意的报道,因此我想知道: 最快的集合相交、并集和分离算法是什么?
有没有域名有限的有趣网站?
有人能打败O(Z)吗,其中Z是交叉口的实际大小

如果你的方法依赖于排序集,请注意,但不要认为它是一个不合格的因素。在我看来,必须有一个真正的仓库来共享微妙的优化,我不想错过任何一个

我知道的一些算法依赖于超出常规的位操作,因此您可以假设SSE4的存在以及对popcount等内部函数的访问。请注意这个假设

感兴趣的:

更新
我们得到了一些非常好的部分答案,但我仍然希望对这个问题有一些更全面的攻击。我特别感兴趣的是,在解决这个问题的过程中,可以更全面地使用bloom过滤器

更新

我已经做了一些将bloom过滤器与布谷鸟哈希表相结合的初步工作。因为他们有着非常相似的要求,这看起来几乎是令人讨厌的希望。我已经接受了一个答案,但我现在还不是很满意。

没有比O(Z)更好的解决方案,因为如果你从逻辑上考虑问题,每个相交、并集和分离算法都必须至少读取所有输入元素一次,所以Z读取是必须的。另外,由于默认情况下该集合没有排序,因此没有任何进一步的优化可以击败O(Z)

如果集合实际上是一个哈希集合,并且两个集合具有相同的哈希函数和表大小,那么我们可以跳过仅存在于一个集合中的所有桶。这可能会缩小搜索范围。

< P>如果你愿意考虑类似集合的结构,那么就有琐碎的联合和交叉操作。

< P>抽象地,一个集合是支持一个操作的东西,“X是一个成员吗?”您可以根据
A
B
定义交叉口
A和
B
上的操作。实现将类似于:

interface Set { bool isMember(Object X); };

class Intersection {
    Set a, b;
    public Intersection(Set A, Set B) { this.a = A; this.b = B; }

    public isMember(Object X) {
        return a.isMember(X) and b.isMember(Y);
    }
}
A
B
可以使用显式集合类型(如HashSet)实现。每个操作的成本都很低,让我们用O(1)来近似它;因此,十字路口的成本仅为200(n)。;-)


诚然,如果像这样构建一个大型交叉点层次结构,那么检查成员的成本可能会更高,对于层次结构中的n个集合,检查的成本可能高达O(n)。一种潜在的优化方法是对照阈值检查层次结构的深度,如果超过阈值,则将其具体化为哈希集。这将降低成员的运营成本,并可能在应用多个交叉口时摊销施工成本。

对于合理密集的集合,对于您指定的操作,间隔列表可以超过O(n),其中n是集合中的元素数


区间列表本质上是一个严格递增的数字列表[a1,b1,a2,b2,…,An,bn],其中每对ai,bi表示区间[ai,bi)。严格递增约束确保每个可描述集都有唯一的表示。将一个集表示为有序的区间集合,可以让集合操作在每次迭代中处理多个连续元素。

以下文章介绍了顺序上的并集、交集和差分算法如果交点大于差值(Z>n/2),则红色设置跳动O(Z):


这在某种程度上取决于集合的大小。当然!我确实提到了域限制。我仍然希望看到快速的小集合相交。我想一个很好的操作假设是,两个集合中较小的集合必须具有大于1的大小才能使算法感兴趣。是的……至少>1:PI在一般情况下自然会一致,但我怀疑存在性能优于O(Z)的特定于领域的算法。我将添加一个关于排序\未排序的子句,因为我认为这是解决该问题的方法中一个有趣的划分。我可以想到很多情况,在这些情况下,数据一旦被经常查询,就会被排序,或者被保存在类似b树或p-trie的东西中。我甚至认为这些都是有意义的子域。@Jake Kurzer:希望得到一个比O(n)更好的算法的唯一方法是不需要通读所有元素。我认为不可能设计一个“交”、“并”、“断”算法,它不需要读取至少一个集合的所有元素。@Lie Ryan:B-Y算法链接可以(有条件地)比O(n)做得更好,但依赖于经常进行排序的数据,或是处于某种自排序结构中的数据,从而使维护排序顺序的成本降到最低。我可以想到一些其他的数据,尽管它们缺乏参考实现,并且依赖于专门的数据结构。@Jake Kurzer:B-Y算法减少了比较的次数,B-Y没有ot比O(n)做得更好插入**/**删除。你认为如何?据我所知,B-Y只复制实际位于交叉点的元素。我非常喜欢一个可靠的反驳!如果我们的两个集合都在p-try中,这将变得非常有趣和非常有效。我给你一个提示,它依赖于5位或6位的基数,以及popcou的存在nt指令。:)当然,p-try对其中的数据有一定的要求,但我认为即使你的键没有自然的词法顺序,你也可以得到intersect\union\disjoint操作。不过,它们仍然需要能够为键生成某种类型的位字符串。嗯,我刚刚注意到Z是相交的大小。我的功夫这是一个与bloom Filter相似的想法,但有点不同的方法。问题是它仍然是