我用以下方式构建了GroovyMap:
list1 = [ "val1" "val2" "val3" ]
list2 = [ "val7" "val8" ]
list3 = [ "val4" "val5" "val2" ]
list4 = [ "val6" "val4" "val3" ]
map["key1"] = list1
map["key2"] = list2
map["key3"] = list3
map["key4"] = list4
我需要遍历map,并将每个列表与map中的其他列表进行比较,如果列表中的任何项与其他列表中的任何项匹配,则会抛出一个错误,例如,在上面的情况下,由于list1的值(val2)与list3匹配,因此它应该抛出一个错误,并停止在map中进一步处理。
我可以对2个列表进行交叉来找到重复项,但为此我可能需要对Map进行两次迭代,例如,对于每个键,获取值,然后再次迭代Map来获取其他键的列表,并从第一个列表开始逐个交叉来找到重复项或类似的东西,但这不是实现这一点的有效方式。
在groovy中是否可以更有效地实现这一点?
3条答案
按热度按时间yyyllmsg1#
使用
disjoint
执行类似下面的操作怎么样这里
disjoint
的时间复杂度是O(n)
。另外,值得注意的是,在两个列表a
和b
之间,如果a.size()
〈b.size()
,时间复杂度将是O(a)。6g8kf2rb2#
时间复杂度a(a),是一个复杂度为O(n)的过程。
时间复杂度为O(n.log(n))。
时间复杂度为O(n),所以每次迭代的时间复杂度为O(n)。
时间复杂度为O(n·log(n))。
如果n很小,有一个更聪明的方法来实现,特别是当列表中的一个很小的时候。在这种情况下,“暴力”算法的平均失败时间是O(n^2),但是,在任何情况下,如果n很小,优化都是不值得的:编写维护人员最容易理解的程序。
ulydmbyx3#
我会把它们放到一个List中。你只需要在String列表中循环一次。当你把这些项放到List中时,首先检查一下这些项是否在列表中。