【问题标题】:What is a data structure for quickly finding non-empty intersections of a list of sets?什么是快速查找集合列表的非空交集的数据结构?
【发布时间】:2011-02-05 00:56:45
【问题描述】:

我有一组N 项目,它们是整数集,我们假设它是有序的并称之为I[1..N]。给定一个candidate 集合,我需要找到与candidate 有非空交叉点的I 的子集。

所以,例如,如果:

I = [{1,2}, {2,3}, {4,5}]

我正在寻找定义valid_items(items, candidate),这样:

valid_items(I, {1}) == {1}
valid_items(I, {2}) == {1, 2}
valid_items(I, {3,4}) == {2, 3}

我正在尝试优化一个给定的集合I 和一个变量candidate 集合。目前我通过缓存items_containing[n] = {the sets which contain n} 来做到这一点。在上面的例子中,这将是:

items_containing = [{}, {1}, {1,2}, {2}, {3}, {3}]

即0不包含在item中,1包含在item 1中,2包含在item 1和2中,2包含在item 2中,3包含在item 2中,4和5包含在item中第 3 项。

这样,我可以定义valid_items(I, candidate) = union(items_containing[n] for n in candidate)

有没有更有效的数据结构(合理的大小)来缓存这个联合的结果?空格2^N 的明显示例是不可接受的,但NN*log(N) 可以。

【问题讨论】:

    标签: optimization data-structures set mathematical-optimization set-theory


    【解决方案1】:

    我认为您当前的解决方案在 big-O 方面是最佳的,尽管有一些微优化技术可以提高其实际性能。比如将item_containing集合中选择的集合与有效的item集合合并时使用按位运算。

    即您将 items_contains 存储为:

    items_containing = [0x0000, 0x0001, 0x0011, 0x0010, 0x0100, 0x0100]
    

    并且您的 valid_items 可以使用按位 OR 来合并,如下所示:

    int valid_items(Set I, Set candidate) {
        // if you need more than 32-items, use int[] for valid 
        // and int[][] for items_containing
        int valid = 0x0000;
        for (int item : candidate) {
            // bit-wise OR
            valid |= items_containing[item];
        }
        return valid;
    }
    

    但它们并没有真正改变 Big-O 的性能。

    【讨论】:

      【解决方案2】:

      一种可能有帮助的表示是将集合 I 存储为大小为 n 的向量 V,当 i 不在 V 中时其条目 V(i) 为 0,否则为正。然后取两个向量的交集,将项相乘,取并集,将项相加。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-14
        • 2023-03-20
        • 2011-09-24
        • 2016-11-10
        • 1970-01-01
        • 2021-03-14
        • 1970-01-01
        • 2012-03-10
        相关资源
        最近更新 更多