给出两个列表<list<字符串>>(称为a和b).

它返回:map<list<字符串>,list<list<字符串>>

  • 让a,b的项分别是a1,a2,a3,……B1,b2,b3...
  • 仅 Select b1和a1元素中具有重叠字符串​​的项目(列表<字符串>)
  • 在结果中输入Key=b1,Value=a1.

(前)

Define a and b as follows:
a = [a, b, c], [d, e, f], [a, d, f]
b = [a, d], [a], [c], [x]

it returns : 
key        value 
[a,d]    | [a,b,c],[d,e,f],[a,d,f] 
[a]      | [a,b,c],[a,d,f] 
[c]      | [a,b,c] 
[x]      | empty list

In reality, the length of the list in a and b will exceed at least 100,000. I tried this method using the List.contains, but time complexity was O(n^3) at the worst case.
Here is my code, I want to reduce the time complexity of that algorithm below O(n^2).

 public Map<List<String>, List<List<String>>> compute(List<List<String>> a, List<List<String>> b) {

        Map<List<String>, List<List<String>>> result = new HashMap<>();

        for (List<String> elem : b) {
            result.put(elem, a.stream().filter(e -> e.stream().anyMatch(elem::contains)).toList());
        }
        return result;
    }

推荐答案

我不确定有没有办法将其降低到O(n^2)以下,但要将其降低到O(n^2),我们可以将List.containsO(n)乘以HashMap.get,这是O(1)的时间复杂度.

建议不判断contains,而是找到列表a中元素的索引,b个元素将获得该索引并获得相应的a列表.

首先,构建一个包含a个元素作为关键字、值作为其索引的Map.


    Map<String, Set<Integer>> aInSet = new HashMap<>();
    
    for (int i = 0; i < a.size(); i++) {
        for (String elem : a.get(i)) {
            Set<Integer> elementSet = aInSet.getOrDefault(elem, new HashSet<>());
            elementSet.add(i);
            aInSet.put(elem, elementSet);
        }
     }

下面是aInSet的输出,现在我们有了属于的元素的索引列表.

a=[0, 2], b=[0], c=[0], d=[1, 2], e=[1], f=[1, 2]

然后,我们组合b中的元素列表的索引,以获得a中的相应索引.

不算[a, d]英镑,我们有一套加在一起的[0, 1, 2]英镑.以下是代码


    Map<List<String>, List<List<String>>> result = new HashMap<>();

    for (List<String> elem : b) {
        Set<Integer> elemSet = new HashSet<>();
        for (String elemB: elem) {
            elemSet.addAll(aInSet.getOrDefault(elemB, new HashSet<>()));
        }
        List<List<String>> listContainElem = elemSet.stream()
            .map(a::get)
            .collect(Collectors.toList());
        result.put(elem, listContainElem);
    }

Java相关问答推荐

如何从片段请求数据到活动?在主要活动中单击按钮请求数据?

JPackage-results已安装-如何添加系统属性?

Java inline Double条件和值解装箱崩溃

无法在WebSocket onMessage中捕获错误

将不受支持的时区UT重写为UTC是否节省?

为什么不应用类型推断?

具有多种令牌类型和段的复杂Java 17正则表达式

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

用OSQL创建索引

在Frege中,我如何将一个字符串安全地转换为一个可能的Int?

Java中不兼容的泛型类型

Java.lang.invke.LambdaConversionException:实例方法InvokeVirtual的参数数量不正确

STREAMS减少部分结果的问题

为什么相同的数据条码在视觉上看起来不同?

为什么项目名称出现在我的GET请求中?

如何对存储为字符串的大数字数组进行排序?

无泄漏函数的Java DRY

Spring Integration SFTP 连接失败 - 无法协商 kex 算法的密钥交换

更新不可变的深层嵌套字段

如何使用 JDBC 更改 Postgres Enum 类型