【发布时间】:2020-07-14 20:39:14
【问题描述】:
我有两张地图 - Map<String, List<String>> input,另一张是Map<String, List<String>> output。
输入地图
{A=[Apple.txt, Axe.txt, Aid.txt], B=[Ball.txt, Boy.txt,Box.txt], C=[Cow.txt,Cob.txt]}
输出地图
{A=[Apple.txt, Axe.txt, Aid.txt], B=[Ball.txt, Boy.txt]}
我需要为输出映射找到缺失的键值对。
expected output - B= [Box.txt], C=[Cow.txt,Cob.txt]
我需要确定输出映射缺少 B 键的 Box.txt 并且缺少“C”键值对。
我目前的方法:我使用一个 forEach(时间复杂度 O(n))和一个条目集流(时间复杂度:O(m))用于两个导致 O(n*m) 时间复杂度的地图。
inputMap.forEach((key,value) ->
{
final List<Path> countrifiedFolderList = outputFileMap.entrySet().stream()
.filter(entry -> entry.getKey().contains(key))
.filter(files -> !files.getValue().contains(inputFile)).map(Map.Entry::getKey)
.collect(Collectors.toList());
if (!countrifiedFolderList.isEmpty())
{....do processing
}
由于地图包含大量数据,我需要增强性能问题。我需要以小于 O(n*m) 的时间复杂度获取结果。
【问题讨论】:
-
如果您要寻找的条件是
entry.getKey().toString().contains(key),那么您将需要一个更复杂的自定义数据结构,而且创建起来并不简单。如果是entry.getKey().equals(key),那就完全不同了。 -
这里的主要目标是两个比较两个map,在outputMap中找到缺失的键值对
-
为什么没有
A=[], B= [Box.txt], C=[Cow.txt,Cob.txt]作为最终结果?这可能会在一定程度上简化事情,但是如果不遍历与输入或输出映射中的每个键对应的列表中的每个值,您打算如何识别缺少的内容。完整的遍历必须是O(n*m)或者您可能已经从初始输入中选择了数据结构,这样您现在剩下的就是n*m遍历? -
另外,请注意遍历大小为
n的值List中的每个元素并在另一个大小为List的List中执行contains的复杂性@ 987654339@ 将导致复杂性是n*l。使用Set应该有助于优化。
标签: java java-8 hashmap java-stream