Как отфильтровать список 1 без элементов списка 2 - PullRequest
0 голосов
/ 15 января 2019

Каков наилучший способ создать новый список на основе List1 без элементов List2?

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

Содержимое нового списка должно быть:

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

1 Ответ

0 голосов
/ 15 января 2019

В настоящее время лучший способ сделать это - использовать модуль, который обрабатывает наборы, такие как ordsets :

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

Если вы используете Erlang / OTP 22 или более позднюю версию (которая должна быть выпущена в июне 2019 года), лучше всего использовать оператор --:

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

Сложность во время выполнения этой операции - O (n log n), начиная с Erlang / OTP 22, но в более ранних версиях Erlang сложность во время выполнения этой операции - O (n * m), поэтому она будет работать очень плохо, если оба списка очень длинные.


См. главу «Отставные мифы» в Руководстве по эффективности Эрланга :

12.3 Миф: вычитание списка (оператор "-") медленное

Вычитание списка, которое раньше имело сложность во время выполнения, пропорциональную произведению длины его операндов, поэтому оно было чрезвычайно медленным, когда оба списка были длинными.

Начиная с OTP 22, сложность во время выполнения равна "n log n", и операция завершится быстро, даже если оба списка очень длинные. Фактически, это быстрее и использует меньше памяти, чем обычно используемый обходной путь, чтобы преобразовать оба списка в упорядоченные наборы, прежде чем вычесть их с помощью ordsets:subtract/2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...