比较两个列表并获取子对象

时间:2019-07-05 12:51:35

标签: java algorithm optimization

我有2个列表。一个只有父对象,另一个可能有子对象。

由于这些列表可能很大,因此我需要一种方法,通过比较两个列表而不是O(n^2)

来仅获取子对象。

对象成为子对象的条件是它应该以其父对象名称为基础。例如:“ abcd”将是“ abc”的子对象。

List<String> childList=new ArrayList<>();
for(String parent: parentList){
  for(String child: childList){
    if(child.matches(parent + "(.*)"))
      childList.add(child)
  }
}

对于14k个对象,这大约需要10秒钟。有人可以帮我优化这个问题

2 个答案:

答案 0 :(得分:1)

如果我很了解您的问题,那么您有2个字符串列表,AB。目的是确定B中的哪些字符串是A中的字符串的前缀。
然后,存在一个名为trie的数据结构,它可以完成此操作。
首先,您需要将A的每个字符串插入到特里。
然后,对于B的每个字符串,您可以执行以下操作:通过读取当前字符串(或单词)遍历树。如果由于缺少节点而无法到达单词的末尾,则当前单词不是任何对象的“子代”。
另一方面,如果您完成当前单词并且仍在尝试中,则您单词是预先存储的单词的前缀。 您应该找到Java尝试的实现(或有关如何实现它们的想法)here

答案 1 :(得分:1)

根据名称的长度,您可以在第一遍中创建子名称的所有前缀的映射。 (费用 O(n * nameLength)时间)

比起您可以在 O(1)(如果您使用 HashMap )中查找每个父级的子级,子级都有父级名称作为前缀。

您绝对应该避免使用 RegExp 进行匹配。这些都不便宜!


P.s。 如果仅用于检测前缀,您也可以在Google上搜索“前缀树”。