如果有两套 -
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剩余的元素最后可以处理。
答案 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)。