【问题标题】:kotlin: what is the best way to determine if 2 lists have any common element?kotlin:确定 2 个列表是否有任何共同元素的最佳方法是什么?
【发布时间】:2022-04-12 14:29:17
【问题描述】:

找出两个列表是否至少有一个共同元素的最佳方法是什么?我正在尝试在 kotlin 中执行此操作,虽然这很容易,但我想探索哪种方法是最好的方法。

问题:

fun isAnyElementCommon(
    alist: List<String>,
    blist: List<String>
):Boolean

一个例子是:

= alist.intersect(blist).isNotEmpty()

但我认为找出所有公共值然后检查它是否为空

编辑

另一个是:

= alist.any{ blist.contains(it) }

我知道这些解决方案。我只是想知道是否有更好的方法来解决这个问题。如果没有,那也没关系。我正在寻找一种低复杂性和低内存占用的解决方案。此外,在 kotlin 中,大多数情况都由一些辅助扩展函数覆盖。所以也许如果有这样的事情。我想知道。

【问题讨论】:

  • 您可以经典地迭代一个列表并检查另一个列表是否包含当前元素,然后在第一个匹配项处停止。对于最坏的情况(没有共同元素)也将进行大量处理。也许比较两个想法的表现......
  • 如果您想优化时间,请使用地图/字典。如果空间更重要,对 O(NlogN) 使用排序和二进制搜索
  • @ShridharRKulkarni 不,唯一好的答案只能以一种方式解决。评论有更好的解决方案,但不是答案的形式

标签: list algorithm performance kotlin optimization


【解决方案1】:

要将其降低到 O(n),请先将一个列表转换为 Set。

fun isAnyElementCommon(
    aList: List<String>,
    bList: List<String>
):Boolean {
    val aSet = aList.toSet()
    return bList.any { it in aSet }
}

【讨论】:

  • toSet 很昂贵。它创建了一个新集合
  • 还是比O(n^2)便宜。也许如果您的列表中的元素少于〜十个,则分配时间可能不值得。但也许你更注重记忆而不是速度。
【解决方案2】:

也许不够 Kotlin 风格,但 Java 的 Collections.disjoint() 已针对此进行了优化:

fun isAnyElementCommon(
    alist: List<String>,
    blist: List<String>
):Boolean =
    !Collections.disjoint(aList, bList)

【讨论】:

    【解决方案3】:
    1. 将一个列表放入哈希映射中。
    2. 如果第二个列表中的元素存在于哈希映射中,则遍历第二个列表并返回 true。

    【讨论】:

      猜你喜欢
      • 2019-10-22
      • 2021-02-18
      • 2019-08-24
      • 2021-11-03
      • 2011-03-08
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 2015-06-04
      相关资源
      最近更新 更多