查找一个集合中存在的元素而不是另一个集合

时间:2009-12-02 01:38:21

标签: algorithm set

我有两套A和B.

A
--
1
2
6

B
--
1
2
3
4

当我将集合A与B进行比较时,我需要将值6作为输出,将值4作为输出,将集合B与A进行比较。

我想知道最好的算法是什么?我写了一个,但它有二次复杂性。它基本上迭代一个集合并在循环内迭代第二个集合以检查值是否存在。我认为这效率低下。

上下文

我在数据库中有一组值,我在UI中显示。用户可以删除或添加新项目到列表,然后按“保存更改”按钮,这将保留对数据库的所有更改。所以这里我需要将新添加的项插入数据库并删除已删除的项。

所以我传递了第一组,它将包含新添加并已存在的项目。我加载了另一个包含数据库中所有项目的集合。现在,如果我应用上面的算法来比较Set A(新列表)和Set B(数据库列表)并获取SetA中存在的项而不是SetB中的项,我将获得所有新添加的项。然后将SetB与SetA进行比较,并且setB中不存在的所有项目都将是已删除的项目。我愿意接受更好算法的建议。

任何帮助都会很棒。

6 个答案:

答案 0 :(得分:3)

在Python中

>>> A=set((1,2,6))
>>> B=set((1,2,3,4))
>>> A-B
set([6])
>>> B-A
set([3, 4])

假设您没有内置的设置类型
伪代码:

# This computes the items of B that are not in A
a=hash(A)   # Hopefully you at least have some sort of hash type
result=[]   #empty list
for item in B:
    if item not in a:
        result.append(item)

答案 1 :(得分:2)

如果两个集合都已排序,则可以从两个集合的开头开始并遍历它们,比较第一个元素以查看另一个集合中缺少哪些元素。这适用于线性时间。

对于未排序的集合,首先在O(n log(n))时间内对它们进行排序,然后在线性时间内对它们进行比较,得出总时间复杂度为O(n log(n))。根据应用程序的详细信息,也可以始终对这些集进行排序,以便在需要时对其进行比较。

答案 2 :(得分:0)

Here是微软的回答。虽然看了O(n 2

class CompareLists
{        
    static void Main()
    {
        // Create the IEnumerable data sources.
        string[] names1 = System.IO.File.ReadAllLines(@"../../../names1.txt");
        string[] names2 = System.IO.File.ReadAllLines(@"../../../names2.txt");

        // Create the query. Note that method syntax must be used here.
        IEnumerable<string> differenceQuery =
          names1.Except(names2);

        // Execute the query.
        Console.WriteLine("The following lines are in names1.txt but not names2.txt");
        foreach (string s in differenceQuery)
            Console.WriteLine(s);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}
/* Output:
     The following lines are in names1.txt but not names2.txt
    Potra, Cristina
    Noriega, Fabricio
    Aw, Kam Foo
    Toyoshima, Tim
    Guy, Wey Yuan
    Garcia, Debra
     */

答案 3 :(得分:0)

您可以将两个集合放入平衡的二叉树中。在一组中搜索另一组中的元素是O(log n)。因此,在一组中针对另一组搜索n'元素,然后O(n' log n)或仅O(n log n)

如果将两个集合都放入排序数组中,则可以在O(n + n')O(n)时间内以类似步骤的方式遍历两个数组,以确定是否缺少任何一个元素中的元素。

答案 4 :(得分:0)

如果您可以访问哈希集实现(我相信Java,C#和Python都有它们),您可以构建两个集合A和B并获取集合差异。如果未定义设置差异,则可以迭代A的元素并检查B是否具有每个元素。哈希集用哈希表实现,因此可以在线性时间内构建,并且可以在恒定时间内测试成员资格。这意味着总时间将是设定大小总和的线性时间。

答案 5 :(得分:0)

查看Apache CollectionUtils,您可以在其中找到set operatois作为Union,Intersection或者substraction(你想要的是什么)