Алгоритм більшості голосів Боєра — Мура — це алгоритм для знаходження більшості для послідовності елементів з використанням лінійного часу та постійної кількості слів пам'яті. Алгоритм названий на честь [en] та [en], які опублікували його в 1981 році, і є прототипним прикладом потокового алгоритму.
У своїй найпростішій формі алгоритм знаходить основний елемент, якщо він є: тобто елемент, який повторюється для більш ніж половини елементів вхідних даних. Для перевірки того, що елемент, знайдений під час першого проходу, дійсно є основним, можна виконати другий прохід по даним при якому підраховується скільки разів зустрічається цей елемент, після чого перевіряється, що елемент є основним.
Якщо не виконувати другий прохід і при цьому немає більшості, то алгоритм не виявить, що більшість відсутня. У випадку, якщо не існує строгої більшості, повернутий елемент може бути довільним; не гарантовано, що це елемент, який зустрічається найчастіше (мода послідовності). Потоковий алгоритм не може знайти найпоширеніший елемент без використання менш ніж лінійного простору у випадку послідовностей, кількість повторень в яких може бути невеликою.
Опис алгоритму
Алгоритм підтримує у своїх локальних змінних елемент послідовності та лічильник, причому лічильник спочатку дорівнює нулю. Потім він один за одним обробляє елементи послідовності. Під час обробки елемента x, якщо лічильник дорівнює нулю, алгоритм зберігає x як запам'ятований елемент послідовності та встановлює лічильник на одиницю. В іншому випадку він порівнює x із збереженим елементом і або збільшує лічильник (якщо вони однакові), або зменшує лічильник (в іншому випадку). Наприкінці цього процесу, якщо послідовність має більшість, це буде елемент, отриманий алгоритмом. Підсумуємо опис алгоритму в псевдокоді:
- Ініціалізувати елемент m та лічильник i з i = 0
- Для кожного елемента x вхідної послідовності:
- Якщо i = 0, тоді присвоїти m = x і i = 1
- інакше, якщо m = x, тоді присвоїти i = i + 1
- інакше присвоїти i = i − 1
- Повернути m
Навіть якщо вхідна послідовність не має більшості, алгоритм повідомить один з елементів послідовності як результат роботи. Однак, можна виконати другий прохід над тією ж вхідною послідовністю, щоб підрахувати, скільки разів зустрічається отриманий раніше елемент і визначити, чи є він насправді більшістю. Цей другий прохід необхідний, оскільки алгоритм, який використовує (сублінійний) простір не може визначити, чи існує основний елемент за один прохід по входовим даним.
Реалізація на мові Python
Знайдемо елемент, який може бути основним і перевіримо його на більшість.
from typing import List, Union def majorityElement(nums: List[int]) -> Union[int, None]: candidate, counter = None, 0 for element in nums: if element == candidate: counter += 1 elif counter == 0: candidate, counter = element, 1 else: counter -= 1 # Перевіряємо на більшість if nums.count(candidate) >= len(nums) // 2 + 1: majority_element = candidate else: majority_element = None return majority_element
Аналіз алгоритму
Об'єм пам'яті, який потрібен алгоритму, — це простір для одного елемента та одного лічильника. У моделі обчислень з довільним доступом, яка зазвичай використовується для аналізу алгоритмів, кожне з цих значень може зберігатися в машинному слові, а загальний необхідний простір дорівнює (O(1)). Якщо для відстеження позиції алгоритму у вхідній послідовності потрібен індекс масиву, то він не змінює загальну оцінку простору. Бітова складність алгоритму (простір, який йому знадобиться, наприклад, на машині Тьюрінга) є вищою, ніж сума двійкових логарифмів довжини вхідних даних і розміру універсуму, з якого беруться елементи. Як модель довільного доступу, так і аналіз бітової складності враховують лише робочу пам'ять алгоритму, а не пам'ять для самої вхідної послідовності.
Аналогічно, на машині з довільним доступом алгоритм займає час O(n) ((лінійний час)) для вхідної послідовності з n елементів, оскільки він виконує лише постійну кількість операцій на кожен вхідний елемент. Алгоритм також може бути реалізований на машині Тюрінга в часі, лінійному відносно довжини входу (n помножене на число бітів виділених на вхідний елемент).
Коректність алгоритму
Припустимо, що ми маємо послідовність розміром N, яка має мажоритарний елемент m. Шляхом заперечення можна показати, що алгоритм не може вивести немажоритарний елемент.
Алгоритм вибирає перший елемент у послідовності як мажоритарний кандидат c та ініціалізує counter для цього кандидата зі значенням 1. Якщо кандидат не є мажоритарним елементом, тоді лічильник повинен досягати нуля, оскільки в послідовності є більше елементів, які не дорівнюють кандидату. Коли лічильник досягає нуля після K < N ітерацій, ми обробили рівно K / 2 елементів із значенням кандидата (K має бути парним). Незалежно від того, дорівнює кандидат мажоритарному елементу m чи ні, у нас залишається підпослідовність довжиною N — K, де m все ще є мажоритарним елементом.
Див. також
- [en], задача на перевірку того, що колекція має будь-які повторювані елементи
- Мажоритарна функція, більшість із колекції булевих значень
- [en], задача знаходження мажоритарного елемента в обчислювальній моделі клітинного автомата
- [en] та [en], природне узагальнення алгоритму Боєра — Мура щодо зберігання кількох елементів.
Примітки
- ; (1991), MJRTY - A Fast Majority Vote Algorithm, у Boyer, R. S. (ред.), Automated Reasoning: Essays in Honor of Woody Bledsoe, Automated Reasoning Series, Dordrecht, The Netherlands: Kluwer Academic Publishers, с. 105—117, doi:10.1007/978-94-011-3488-0_5[недоступне посилання з 01.06.2022] Спочатку було опубліковано у вигляді технічного звіту в 1981 році
- ; (26 січня 2012), Notes on streaming algorithms (PDF), CS154: Automata and Complexity, Stanford University.
- Cormode, Graham; Hadjieleftheriou, Marios (October 2009), Finding the frequent items in streams of data, Communications of the ACM, 52 (10): 97, doi:10.1145/1562764.1562789,
no algorithm can correctly distinguish the cases when an item is just above or just below the threshold in a single pass without using a large amount of space
.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Algoritm bilshosti golosiv Boyera Mura ce algoritm dlya znahodzhennya bilshosti dlya poslidovnosti elementiv z vikoristannyam linijnogo chasu ta postijnoyi kilkosti sliv pam yati Algoritm nazvanij na chest en ta en yaki opublikuvali jogo v 1981 roci i ye prototipnim prikladom potokovogo algoritmu Stan algoritmu Boyera Mura pislya obrobki kozhnogo vhidnogo simvolu Vhidni dani pokazani v nizhnij chastini malyunka a zberezhenij element i znachennya lichilnika elementa u vidpovidnomu stani zobrazheni yak simvol ta visota U svoyij najprostishij formi algoritm znahodit osnovnij element yaksho vin ye tobto element yakij povtoryuyetsya dlya bilsh nizh polovini elementiv vhidnih danih Dlya perevirki togo sho element znajdenij pid chas pershogo prohodu dijsno ye osnovnim mozhna vikonati drugij prohid po danim pri yakomu pidrahovuyetsya skilki raziv zustrichayetsya cej element pislya chogo pereviryayetsya sho element ye osnovnim Yaksho ne vikonuvati drugij prohid i pri comu nemaye bilshosti to algoritm ne viyavit sho bilshist vidsutnya U vipadku yaksho ne isnuye strogoyi bilshosti povernutij element mozhe buti dovilnim ne garantovano sho ce element yakij zustrichayetsya najchastishe moda poslidovnosti Potokovij algoritm ne mozhe znajti najposhirenishij element bez vikoristannya mensh nizh linijnogo prostoru u vipadku poslidovnostej kilkist povtoren v yakih mozhe buti nevelikoyu Opis algoritmuAlgoritm pidtrimuye u svoyih lokalnih zminnih element poslidovnosti ta lichilnik prichomu lichilnik spochatku dorivnyuye nulyu Potim vin odin za odnim obroblyaye elementi poslidovnosti Pid chas obrobki elementa x yaksho lichilnik dorivnyuye nulyu algoritm zberigaye x yak zapam yatovanij element poslidovnosti ta vstanovlyuye lichilnik na odinicyu V inshomu vipadku vin porivnyuye x iz zberezhenim elementom i abo zbilshuye lichilnik yaksho voni odnakovi abo zmenshuye lichilnik v inshomu vipadku Naprikinci cogo procesu yaksho poslidovnist maye bilshist ce bude element otrimanij algoritmom Pidsumuyemo opis algoritmu v psevdokodi Inicializuvati element m ta lichilnik i z i 0 Dlya kozhnogo elementa x vhidnoyi poslidovnosti Yaksho i 0 todi prisvoyiti m x i i 1 inakshe yaksho m x todi prisvoyiti i i 1 inakshe prisvoyiti i i 1 Povernuti m Navit yaksho vhidna poslidovnist ne maye bilshosti algoritm povidomit odin z elementiv poslidovnosti yak rezultat roboti Odnak mozhna vikonati drugij prohid nad tiyeyu zh vhidnoyu poslidovnistyu shob pidrahuvati skilki raziv zustrichayetsya otrimanij ranishe element i viznachiti chi ye vin naspravdi bilshistyu Cej drugij prohid neobhidnij oskilki algoritm yakij vikoristovuye sublinijnij prostir ne mozhe viznachiti chi isnuye osnovnij element za odin prohid po vhodovim danim Realizaciya na movi PythonZnajdemo element yakij mozhe buti osnovnim i perevirimo jogo na bilshist from typing import List Union def majorityElement nums List int gt Union int None candidate counter None 0 for element in nums if element candidate counter 1 elif counter 0 candidate counter element 1 else counter 1 Pereviryayemo na bilshist if nums count candidate gt len nums 2 1 majority element candidate else majority element None return majority elementAnaliz algoritmuOb yem pam yati yakij potriben algoritmu ce prostir dlya odnogo elementa ta odnogo lichilnika U modeli obchislen z dovilnim dostupom yaka zazvichaj vikoristovuyetsya dlya analizu algoritmiv kozhne z cih znachen mozhe zberigatisya v mashinnomu slovi a zagalnij neobhidnij prostir dorivnyuye O 1 Yaksho dlya vidstezhennya poziciyi algoritmu u vhidnij poslidovnosti potriben indeks masivu to vin ne zminyuye zagalnu ocinku prostoru Bitova skladnist algoritmu prostir yakij jomu znadobitsya napriklad na mashini Tyuringa ye vishoyu nizh suma dvijkovih logarifmiv dovzhini vhidnih danih i rozmiru universumu z yakogo berutsya elementi Yak model dovilnogo dostupu tak i analiz bitovoyi skladnosti vrahovuyut lishe robochu pam yat algoritmu a ne pam yat dlya samoyi vhidnoyi poslidovnosti Analogichno na mashini z dovilnim dostupom algoritm zajmaye chas O n linijnij chas dlya vhidnoyi poslidovnosti z n elementiv oskilki vin vikonuye lishe postijnu kilkist operacij na kozhen vhidnij element Algoritm takozh mozhe buti realizovanij na mashini Tyuringa v chasi linijnomu vidnosno dovzhini vhodu n pomnozhene na chislo bitiv vidilenih na vhidnij element Korektnist algoritmuPripustimo sho mi mayemo poslidovnist rozmirom N yaka maye mazhoritarnij element m Shlyahom zaperechennya mozhna pokazati sho algoritm ne mozhe vivesti nemazhoritarnij element Algoritm vibiraye pershij element u poslidovnosti yak mazhoritarnij kandidat c ta inicializuye counter dlya cogo kandidata zi znachennyam 1 Yaksho kandidat ne ye mazhoritarnim elementom todi lichilnik povinen dosyagati nulya oskilki v poslidovnosti ye bilshe elementiv yaki ne dorivnyuyut kandidatu Koli lichilnik dosyagaye nulya pislya K lt N iteracij mi obrobili rivno K 2 elementiv iz znachennyam kandidata K maye buti parnim Nezalezhno vid togo dorivnyuye kandidat mazhoritarnomu elementu m chi ni u nas zalishayetsya pidposlidovnist dovzhinoyu N K de m vse she ye mazhoritarnim elementom Div takozh en zadacha na perevirku togo sho kolekciya maye bud yaki povtoryuvani elementi Mazhoritarna funkciya bilshist iz kolekciyi bulevih znachen en zadacha znahodzhennya mazhoritarnogo elementa v obchislyuvalnij modeli klitinnogo avtomata en ta en prirodne uzagalnennya algoritmu Boyera Mura shodo zberigannya kilkoh elementiv Primitki 1991 MJRTY A Fast Majority Vote Algorithm u Boyer R S red Automated Reasoning Essays in Honor of Woody Bledsoe Automated Reasoning Series Dordrecht The Netherlands Kluwer Academic Publishers s 105 117 doi 10 1007 978 94 011 3488 0 5 nedostupne posilannya z 01 06 2022 Spochatku bulo opublikovano u viglyadi tehnichnogo zvitu v 1981 roci 26 sichnya 2012 Notes on streaming algorithms PDF CS154 Automata and Complexity Stanford University Cormode Graham Hadjieleftheriou Marios October 2009 Finding the frequent items in streams of data Communications of the ACM 52 10 97 doi 10 1145 1562764 1562789 no algorithm can correctly distinguish the cases when an item is just above or just below the threshold in a single pass without using a large amount of space