如何在两个不同的集合中配对元素?

时间:2015-04-02 12:14:59

标签: java algorithm data-structures

如果有两套 -

set1 - [tag, boLD, Link]
set2 - [BOLd, TAG, Badge, foo]

什么是制作元素对的有效算法,如 -

pairs = [tag, TAG], [boLD, BOLd], [Link, null], [null, Badge], [null, foo]

请注意,配对是基于case-insensitive名称。

我想避免O(N ^ 2),它迭代地查找set1中的所有元素,并查看set2中的元素。

编辑:我想如果我们可以使用Ternary Search Tries来制作符号表,其中键是来自set1的元素,而来自set2的值。 set2剩余的元素最后可以处理。

3 个答案:

答案 0 :(得分:3)

如果您使用支持O(n) 获取操作的数据结构,则可以在O(1)中执行此操作 - 例如HashMap

    HashMap<String, String> set1 = new HashMap<>();
    HashMap<String, String> set2 = new HashMap<>();
    class Pair{
        String str1;
        String str2;

        Pair(String s1, String s2){
            str1 = s1;
            str2 = s2;
        }
    }
    Set <Pair> pairs = new HashSet<>();
    set1.put("tag", "tag");
    set1.put("bold", "boLD");
    set1.put("link", "Link");
    set2.put("tag", "TAG");
    set2.put("bold", "BOLd");
    set2.put("badge", "Badge");
    set2.put("foo", "foo");

    for (String s : set1.keySet()){
        if (set2.containsKey(s))
            pairs.add(new Pair(set1.get(s), set2.get(s)));
        else
            pairs.add(new Pair(set1.get(s), null));
    }

    for (String s : set2.keySet()){
        if (!set1.containsKey(s))
            pairs.add(new Pair(null, set2.get(s)));
    }

    for(Pair p : pairs)
        System.out.println(p.str1 + " " + p.str2);

答案 1 :(得分:1)

你可以创建一个HashMap并迭代这两个数组。对于键,您可以使用每个字符串的小写表示。这应该为您提供线性运行时复杂性,并且非常容易实现。

答案 2 :(得分:1)

一个简单的解决方案(在Python中给出,现在懒得编写Java)在列表的长度上是线性的,如下所示:

map1 = {}
for i,e in enumerate(set1):
    s = e.lower()
    map1[s] = i

map2 = {}
for i,e in enumerate(set2):
    s = e.lower()
    map2[s] = i

pairs = []
for i,e in enumerate(set1):
    s = e.lower()
    if s in map2:
        elem = (e, set2[map2[s]])
    else:
        elem = (e, None)
    pairs.append(elem)

for i,e in enumerate(set2):
    s = e.lower()
    if s not in map1:
        pairs.append((None, e))

我也假设输入中没有重复,即它与另一组中的0或1个单词匹配,并且每个集合中不同的单词不同,因为我不确定那么你期望你的输出是什么。

这可能不是最有效的方法,但总体看来还不错,因为它仍然是O(n)。