Рубрики
Без рубрики

Веселье с линейным временем: Мой любимый алгоритм

Линейное время большинства голосов алгоритм, я люблю этот алгоритм, потому что это удивительно и соответствует … Теги с обсуждением, Python, начинающими, вызов.

Линейное время большинства голосов алгоритм

Я люблю этот алгоритм, потому что это удивительно и доступно. Сначала я видел это на лечете обсудить нить, и все взорвали всех. Некоторые люди были, как, ир. 169. Элемент большинства Отказ Я хотел бы услышать о ваших любимых водорослях в комментариях!

Эта проблема, общая на конкурентных кодирующих площадках, имеет решение, которое было обнаружено в 1980 году, но было неопубликовано до 1991 года из-за его акцента на коррешную и механическую проверку.

Проблема: Учитывая список голосов с большинством ( n /2 + 1), объявить лидер. Как в, самое часто происходящее голосование. Можно получить результат в линейное время На) И постоянное пространство O (1) Отказ

Примеры:

[0, 1, 1, 0, 1, 0, 1, 1] = > 1 – это элемент большинства

[«А», «B», «A», «C», «B», «C», «A», «A»] => ‘a’ это большинство здесь

Наивное решение может выглядеть так. Мы будем использовать словарь, чтобы отслеживать все голоса, а также хранение наибольшего количества голосов, которые мы видели.

def majority_vote(votes):
    leader = None
    max_votes = 0
    candidates = dict()

    for i in votes:
        # if seen before
        if i in candidates:
            # count their vote
            candidates[i] += 1
            # and check if they're leading
            if candidates[i] > max_votes:
                leader = i
                max_votes = candidates[i]
        else:
            candidates[i] = 1

    return leader

Вышеуказанное выполняет правильное решение в линейном времени O (n) Использование линейного пространства На) . Мы можем сделать лучше. Один проход, без Подсчет каждого элемента.

MJRTY или Алгоритм быстрого голоса большинства Был обнаружен в лаборатории компьютерной науки SRI International в 1980 году Робертом С. Бойером и Джным островом Муром. Они помогали коллеге, который работал над толерантностью.

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

Предположим, что бой пола должен

Они обнарили, что избиратели могут одновременно сбивать друг друга, идущие только для противоборствующей команды. После беспорядка, уехание избирателей/с, поставило бы большинство.

Вот бесконенный способ председателя может имитировать фазу сопряжения.

Их алгоритм улучшает наше наивное решение, удалив структуру данных (словарь). Переоборудован здесь из Фортран в Питон.

def majority_vote_improved(votes):
    # after one vote, we have a leader
    leader = votes[0]
    count = 1

    for i in range(1, len(votes)):
        # the lead may grow
        if votes[i] == leader:
            count += 1
        else:
            # or shrink
            count -= 1

        # and they may be replaced
        if count == 0:
            leader = votes[i]
            count = 1

    return leader

Таким образом, большинство найден в линейном времени На) с постоянным пространством O (1) Отказ

Проверьте пошаговое прохождение на Муру Сайт Отказ Больше на Википедия слишком.

Все усилия уточнения MJRTY и получение условий проверки 61 оказались требованиями около 20 часов человека. […] Около 55 минут компьютерного времени для доказательства окончательного списка 66 теорем.

MJRTY – Алгоритм голосования быстрого большинства, с R.S. Бойер. В R.S. Бойер (ред.), Автоматизированные рассуждения: эссе в честь древесного блеска, автоматизированные рассужденные серии, академические издатели Kluwer, Dordrecht, Нидерланды, 1991, PP. 105-117.

Присоединяйтесь 150+ человек, подписанные на мой рассылка О программировании и личном росте!

Я Tweet о Tech @healecodes Отказ

Оригинал: “https://dev.to/healeycodes/any-of-y-all-have-a-favorite-algorithm-here-s-mine-3kki”