У меня есть два больших списка, длина элементов которых не постоянна. Каждый список включает миллионы пунктов. И я хочу подсчитать частоту элементов first list
в second 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 : Пожалуйста, не учитывайте тип входов и выходов, важна скорость выполнения.