Bojer-Murov algoritam većinskog glasa

С Википедије, слободне енциклопедије

Bojer-Murov algoritam preovlađujućeg elementa u linearnom vremenu[O(n)] i konstantnoj prostornoj složenosti [O(1)]. Problem preovlađujućeg elementa služi da se utvrdi da li u nekoj unapred zadatoj nisci postoji neki element koji je većinski, i ako postoji algoritam nam daje konkretan element. Matematički, za zadatu konačnu nisku (dužine n), cilj je pronaći element koji se pojavljuje više od [ n/2 ] puta.

Opis[уреди | уреди извор]

Algoritam se izvršava u dva koraka:

1. Eleminisati sve elemente osim jednog.

Iterirajući kroz nisku, održavamo trenutnog kandidata i brojač (brojač je inicijalno 0). Prolaskom kroz niz u svakom koraku uvećavamo vrednost brojača (Ukoliko naiđemo na element koga smo proglasili za kandaidata) inače smanjujemo brojač. U slučaju da je brojač 0, naredni element proglašavamo za kandidata i nastavljamo pretragu.

2. Provera da li je preostali kandidat zaista većinski.

Nakon što smo izdvojili potencijalnog kandidata u koraku 1, prolazimo kroz nisku i prebrojavamo broj pojavljivanja našeg kandidata. Ukoliko je broj pojavljivanja našeg kandidata veći od polovine dužine niske, tada je naš kandidat zaista većinski element. Inače naša niska nema većinski element.

Implementacije u C-u[уреди | уреди извор]

Algoritam Preovladjuje (x,n):
ulaz: x, n /* niz pozitivnih brojeva x, dimenzije n*/
izlaz: preovlada /* preovladjujuci alaement (ako postoji) ili -1 */
C=x[0];
M=1;
for(i=1; i < n; i++)
 if (M==0)
 {C=x[i]; M=1;}
 else
 if (x[i]==C) M++; else M--;
if (M==0) preovlada=-1; /*nema preovladjujuceg elementa*/
else brojac=0;
for (i=0; i < n; i++)
 if (x[i]==C) brojac++;
if (brojac > n/2) preovlada=C; else preovlada=-1; 
Algoritam Preovladjuje (x,n):
Ulaz x, n /* niz brojeva x, dimenzije n*/
Izlaz /* preovladjujuci element (ako postoji) ili -1 */
{
  C=x[0];
  M=1;
  for(i=1; i<n; i++){
    if (M==0) {
      C=x[i];
      M=1;
    }
    else {
      if (x[i]==C) M++;
      else M--;
    }
  }
  if (M==0)
    return -1; /*nema preovladjujuceg elementa*/
  else
    brojac=0;
  for (i=0; i < n; i++)
    if (x[i]==C)
      brojac++;
  if (brojac > n/2)
    return C;
  else
    return -1;
}

Implementacija u Javi[уреди | уреди извор]

import java.util.*;
public class MajorityVote {
    public int majorityElement(int[] num) {
        int n = num.length;
        int candidate = num[0], counter = 0;
        for (int i : num) {
            if (counter == 0) {
                candidate = i;
                counter = 1;
            } else {
                if (i == candidate) {
                    counter++;
                } else {
                    counter--;
                }
            }
        }

        counter = 0;
        for (int i : num) {
            if (i == candidate) counter++;
        }
        if (counter < (n + 1) / 2) return -1;
        return candidate;

    }
    public static void main(String[] args) {
        MajorityVote s = new MajorityVote();
        System.out.format("%d\n", s.majorityElement(new int[] {1, 2, 3}));
        System.out.format("%d\n", s.majorityElement(new int[] {2, 2, 3}));
    }
}


Spoljašnje veze[уреди | уреди извор]