Когда я читал это (Найдите наиболее распространенную запись в массиве), линейное время Бойера и Мура Был предложен алгоритм голосования.
Если пройти по ссылке на сайт, там есть пошаговое объяснение того, как работает алгоритм. Для данной последовательности AAACCBBCCCBCC
это верное решение.
Когда мы перемещаем указатель вперед над элементом e:
- Если счетчик равен 0, мы устанавливаем для текущего кандидата значение e, а для счетчика устанавливаем значение 1.
- Если счетчик не равен 0, мы увеличиваем или уменьшаем значение счетчика в зависимости от того, является ли e текущим кандидатом.
Когда мы закончим, текущий кандидат будет элементом большинства, если есть большинство.
Если я использую этот алгоритм на листе бумаги с AAACCBB
в качестве входных данных, предложенный кандидат станет B, что явно неправильно.
Как я понимаю, есть два варианта
- Авторы никогда не пробовали свой алгоритм ни на чем другом, кроме
AAACCBBCCCBCC
, они совершенно некомпетентны и должны быть немедленно уволены (сомнительно). - Я явно что-то упускаю, должен быть забанен в Stackoverflow и мне никогда больше не разрешат прикасаться к чему-либо, связанному с логикой.
Примечание. Вот реализация алгоритма на C++ от Niek Sanders. . Я считаю, что он правильно реализовал идею, и поэтому у него такая же проблема (или нет?).