【发布时间】:2020-05-06 14:24:58
【问题描述】:
我有两个大列表,它们的项目长度不是恒定的。每个列表都包含数百万项。
我想统计second list中first list项目的频率!
例如:
a = [[c, d], [a, b, e]]
b = [[a, d, c], [e, a, b], [a, d], [c, d, a]]
# expected result of calculate_frequency(a, b) is %{[c, d] => 2, [a, b, e] => 1} Or [{[c, d], 2}, {[a, b, e], 1}]
由于列表很大,我希望这个过程同时进行。 所以我写了这个函数:
def calculate_frequency(items, data_list) do
items
|> Task.async_stream(
fn item ->
frequency =
data_list
|> Enum.reduce(0, fn data_row, acc ->
if item -- data_row == [] do
acc + 1
else
acc
end
end)
{item, frequency}
end,
ordered: false
)
|> Enum.reduce([], fn {:ok, merged}, merged_list -> [merged | merged_list] end)
end
但是这个算法很慢。我应该怎么做才能加快速度?
PS:请不要考虑输入输出的类型,执行速度很重要。
【问题讨论】:
-
Flow是你的朋友。
标签: algorithm erlang elixir word-count