Mientras estaba leyendo esto (Find the most common entry in an array), se sugirió Boyer and Moore's Linear Time Voting Algorithm.Algoritmo de votación de tiempo lineal. No lo entiendo
Si sigue el enlace al sitio, hay una explicación paso a paso de cómo funciona el algoritmo. Para la secuencia dada, AAACCBBCCCBCC
presenta la solución correcta.
Cuando nos movemos hacia adelante el puntero sobre un elemento e:
- Si el contador es 0, nos fijamos el actual candidato a e y establecer el contador a 1. Si
- el contador no es 0, incrementamos o disminuimos el contador según si e es el candidato actual .
Cuando hemos terminado, la corriente candidato es el elemento de la mayoría, si hay una mayoría.
Si utilizo este algoritmo en un pedazo de papel con AAACCBB
como entrada, el candidato sugerido se convertiría en B lo que es obviamente erróneo.
Tal como lo veo, hay dos posibilidades
- Los autores nunca han probado su algoritmo en cualquier otra cosa que
AAACCBBCCCBCC
, son completamente incompetente y debe ser despedido en el acto (doubtfull). - Me falta algo claramente, debo ser excluido de Stackoverflow y nunca más volver a tocar nada que involucre la lógica.
Nota: Aquí hay un C++ implementation of the algorithm de Niek Sanders. Creo que él implementó correctamente la idea y, como tal, tiene el mismo problema (¿o no?).
pasa a todos. No sea demasiado estricto al llevar a cabo el punto 2. de su respuesta :) –
Me tomó un buen par de minutos: P – Blorgbeard
bien, ahora lo veo. El algoritmo establece que "Este algoritmo decide qué elemento de una secuencia es la mayoría". Pasó por alto la parte de la mayoría a primera vista, y asumió que habla sobre el elemento que aparece el número máximo de veces. ¡La mayoría aquí significa que el elemento debe aparecer al menos la mitad de los tiempos de "número de elementos"! – texens