如何在没有列表2元素的情况下过滤列表1

时间:2019-01-15 12:30:19

标签: erlang

在没有SELECT * FROM pattern [every a=EventStream(PressureEvent=0) -> b=EventStream -> c=EventStream(b.temp > 0.7*temp)] 元素的情况下基于List1创建新列表的最佳方法是什么?

List2

新列表的内容应为:

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

1 个答案:

答案 0 :(得分:4)

目前,最好的方法是使用处理集合的模块,例如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相减之前,它比常用的变通方法更快并且使用的内存更少。