关于算法:查找一个集合中存在的元素而不是另一个集合

Finding elements that are present in one set not the other

我有两套A和B。

1
2
3
4
5
6
7
8
9
10
11
12
A
--
1
2
6

B
--
1
2
3
4

当我比较集合A和B时,我需要得到输出值6和输出值4,当集合B和A比较时。

我想知道做这个的最佳算法是什么?我写过一个,但它有二次复杂性。它基本上迭代一个集合,在循环内迭代第二个集合以检查值的存在性。我觉得这是低效的。

语境

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

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

任何帮助都会很好。


Python中的

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

你有一个assuming型内置式集psudocode:

1
2
3
4
5
6
# 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)


如果一个类集是在开始的时候都可以开始步行穿过集和比较它们的第一要素,这是失踪的是能够看到在其他设置。本厂在线性时间。

他们是第一unsorted集,排序在O(nlog(n))的,然后比较他们的球队在球队获得总的线性时间复杂性O(nlog(n))。这取决于你的应用程序的细节,它可能是可能,也让《集类的所有时间,所以制作时,他们需要的是比较容易的。


Apache collectionutils退房,你在哪里找到的operatois集联合,交叉口,或substraction(什么是你想要的)


如果你有一个哈希集访问实现(我相信# Java和Python,C,都有他们的),你可以只是两集的结构,差分和B和把套。如果差是不是定义的集合,你可以只是在iterate元素)和检查,如果有一个给每个B或没有。哈希是一种集实现的哈希表,它可以在操作系统的构建和测试的线性度可以在常数时间。这意味着总的线性和时间将在《集大小。


你可以把两个集为平衡二叉树。搜索是在一个一元集是一O(log n)反对另一个。因此,在一个方向是反对的另一个n'元素集是一O(n' log n)或只是O(n log n)然后。

如果在两个集合类,你可以做成两个数组,数组的iterate通步样或O(n)O(n + n')时装队中,如果确定在一组元或丢失。


这里是一个来自微软的答案。我期待为O(n2),

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
     */