如何在Erlang中实现has_common_element函数检测两列表是否有公共元素
实现Erlang的
has_common_element函数 刚好之前也处理过类似的需求,咱们可以利用Erlang标准库的工具轻松实现这个函数,下面给你两种常见的实现方式:
基础实现:直接遍历检查
最直观的思路就是遍历其中一个列表的每一个元素,用lists:member/2检查它是否存在于另一个列表中。只要找到第一个公共元素,就可以立刻返回true,不用继续遍历——这里可以用lists:any/2来帮我们做这件事,它会在找到第一个满足条件的元素时就停止遍历,效率还不错:
has_common_element(List1, List2) -> lists:any(fun(Element) -> lists:member(Element, List2) end, List1).
测试一下你的例子:
has_common_element([1,2,3], [4,5,6])→ 返回false,符合预期has_common_element([1,2,3], [1,7,8])→ 返回true,因为元素1在两个列表里都存在
优化版:用集合提升性能
如果你的列表比较大,上面的基础实现时间复杂度是O(m*n)(m和n是两个列表的长度),可能会有点慢。这时候可以把其中一个列表转换成集合,集合的成员检查是O(1)的操作,能把总时间复杂度降到O(m + n):
has_common_element(List1, List2) -> % 把第一个列表转成集合,减少后续查找的时间 ElementSet = sets:from_list(List1), lists:any(fun(Element) -> sets:is_element(Element, ElementSet) end, List2).
这个版本在处理大列表的时候优势会很明显,当然如果你的列表本来就很小,两种方式的差异不大,选哪个都可以。
另外要注意,不管列表里有没有重复元素,这两个实现都能正常工作——咱们只需要确认是否存在至少一个公共元素,重复元素不会影响结果。
内容的提问来源于stack exchange,提问作者user11577175
相关产品推荐
相关产品推荐

