在没有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"].
答案 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
相减之前,它比常用的变通方法更快并且使用的内存更少。