Удалить дубликаты из списка (скорость алгоритма) - PullRequest
0 голосов
/ 27 декабря 2018

Я сейчас читаю Как думать как компьютерный ученый и прорабатываю там упражнения.В разделе «Алгоритм списка» есть функция (remove_adjacent_dups), которую, я думал, можно улучшить.

Исходная функция:

def remove_adjacent_dups(xs):
    """ Return a new list in which all adjacent
        duplicates from xs have been removed.
    """
    result = []
    most_recent_elem = None
    for e in xs:
        if e != most_recent_elem:
            result.append(e)
            most_recent_elem = e

    return result

Моя функция:

def remove_duplicates(xs):
    """Removes duplicate elements from given list ”xs” """
    result = []
    for e in xs:
        if e not in xs:
            result.append(e)
    return result

remove_adjacent_dups будет работать только с отсортированным списком, поэтому требуется дополнительная операция. remove_duplicates Не важно, отсортирована последовательность или нет, она все равно удалит все дубликаты.Дело в том, что, если я применю свою функцию к упражнению в книге, оно будет значительно медленнее:

remove_duplicates:

Там27336 слов в книге.Уникальны только 2569.

Это заняло 0,2556 секунды.

remove_adjacent_dups:

В книге 27336 слов.Только 2569 уникальны.

Это заняло 0,0132 секунды.(операция сортировки включена в это время)

Любой может понять, почему remove_adjacent_dups более эффективен, даже если он включает в себя дополнительную операцию сортировки и имеет еще одну дополнительную переменную most_recent_elem

1 Ответ

0 голосов
/ 27 декабря 2018

Дополнительная переменная не будет медленнее , как вы могли бы себе представить.

На самом деле ключ здесь:

if e not in results:

Еслирезультат равен True, это займет очень много времени, поскольку список весь повторяется один раз.Это означает, что со списком из 10 элементов и огромным списком из 100 000 элементов время выполнения e not in lst варьируется много .

С remove_adjacent_duplicates вы толькоПосмотрим на последний элемент, поэтому это сравнение занимает постоянное количество времени и не зависит от длины списка.

...