【问题标题】:How to filter list 1 without elements of list 2如何过滤没有列表 2 元素的列表 1
【发布时间】:2019-01-16 03:15:27
【问题描述】:

在没有List2 元素的情况下基于List1 创建新列表的最佳方法是什么?

List1 = ["Candy", "Brandy", "Sandy", "Lady", "Baby", "Shady"].
List2 = ["Sandy", "Shady", "Candy", "Sandy"].

新列表的内容应该是:

List3 = ["Brandy", "Lady", "Baby"].

【问题讨论】:

    标签: erlang


    【解决方案1】:

    目前,最好的方法是使用处理集合的模块,例如ordsets

    > ordsets:subtract(ordsets:from_list(List1), ordsets:from_list(List2)).
    ["Baby","Brandy","Lady"]
    

    如果您使用的是 Erlang/OTP 22 或更高版本(将于 2019 年 6 月发布),最好的方法是使用 -- 运算符:

    > List3 = List1 -- List2.
    ["Brandy","Lady","Baby"]
    

    从 Erlang/OTP 22 开始这个操作的运行时复杂度是 O(n log n),但是在早期的 Erlang 版本中,这个操作的运行时复杂度是 O(n*m),所以如果两个列表都很长。


    the Retired Myths chapter in the Erlang Efficiency Guide:

    12.3 误区:列表减法(“--”运算符)很慢

    过去,列表减法的运行时复杂度与其操作数长度的乘积成正比,因此当两个列表都很长时,它的速度非常慢。

    从 OTP 22 开始,运行时复杂度为“n log n”,即使两个列表都很长,操作也会很快完成。事实上,与常用的解决方法相比,在用ordsets:subtract/2 减去它们之前将两个列表转换为有序集,它更快并且使用更少的内存。

    【讨论】:

    • 两个列表都不会超过 5-10 个元素。谢谢您的回答
    猜你喜欢
    • 2019-04-28
    • 2017-05-08
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多