Modalna - funkcja nie zwraca poprawnego wyniku

0

Witam, mam pewien problem dotyczacy funkcji na modalną. Nie moglem sobie sam poradzic z napisaniem takiej funkcji a wiec skorzystalem z informacji na tej stronie: http://mwzsw.cal.pl/lekcje_i/lider.html z kodu na lidera zbioru. Dopasowałem kod do własnych zmiennych etc i niestety nie dziala tak jak nalezy. Otóż powinno zwrocic z tablicy modalna a niestety zwraca "-1"

Tak wyglada moj kod:

double modalna(int ilosc, double *tablica)
{
    double moda=tablica[0];
    int licznik=1;
    for (int i=0;i<ilosc;i++)
    {
        if (licznik==0)
        {
            moda=tablica[i];
            licznik=1;
        }
        else
            if (moda==tablica[i]) licznik++;
        else licznik--;
    }
    int ile=0;
    if (licznik>0)
    {
        for (int i=0;i<ilosc;i++)
        {
            if (tablica[i]==moda) ile++;
        }
    }
    if (ile>(ilosc/2)) return moda;
    else return -1;
}

Gdzie ilosc-rozmiar tablicy jednowymiarowej, *tablica - wskaznik do tablicy jednowymiarowej zawartej w klasie.
Niestety nie potrafie dojsc do tego dlaczego funkcja nie dziala.
Czy bylby ktos w stanie pomoc?

0

Podejrzewam że jest tak dla tego że nie potrafisz tej funkcji poprawnie wywołać. Pokaż jak wywołujesz.

0

Właśnie nie w tym jest problem bo na pewno dobrze wywoluje ale wywoluje w ten sposob: modalna(N,czas_doj.tab_Zaklad1) - czyli jak kazda inna funkcje.
Ale udało mi sie już to zrobić innym sposobem.
Tak teraz wyglada funkcja ktora juz dziala poprawnie:

void modalna(int ilosc, double *tablica)
{
    double ile = 0;
    double moda_kandydat,licznik,moda;
    for(int i=0;i<ilosc;i++)
    {
        moda_kandydat = tablica[i];
        licznik = 0;
        for(int j=0;j<ilosc;j++)
            if(tablica[j] == moda_kandydat) licznik++;
        if(licznik>ile)
        {
            ile=licznik;
            moda=moda_kandydat;
        }
    }
    cout<<"Modalna: "<<moda<<" wystepuje "<<ile<<" razy.";
}

I teraz mam takie pytanie. Modalna to wartosc najczesciej wystepujaca. W jednej tablicy pokazuje wartosc 27 ktora wystepuje 4 razy. Jest jednak jeszcze jedna wartosc =29 ktora takze wystepuje 4 razy. Chcialbym wiedziec w jaki sposob mozna wypisac obie te wartosci ?

1

Tak najprościej to

  • policzyć ile_razy występuje każda liczba, zapamiętać max (to wtedy jest to ilość wystąpień modalnej w zbiorze).
  • sprawdzić, każdą liczbę, ile razy występuje, jeśli tyle co max to znaczy, że jest modalna.
    Niestety kiepsko z wydajnością.
1

Najprościej zrobić zliczanie za pomocą mapy a potem wypisać elementy które maja maksymalny licznik. Średni czas dla unordered_map to O(n) dla tego algorytmu.
BTW: pierwszy kod ci nie działał bo nie umiesz czytać. Algorytm który zaimplementowałeś szukał lidera ciągu - wartości która występuje ponad połowę razy w danym ciągu. To jest dominanta, to fakt, ale są też ciągi gdzie nie ma lidera zbioru (bo ciąg ma 10 elementów ale żaden nie występuje więcej niż 5 razy) a dominante ma...

0

Na 100% źle wywołujesz.
modalna(N,czas_doj.tab_Zaklad1)
pokaż deklaracje tab_Zaklad1 oraz jak wyliczasz to N.
Czy wiesz że w C/C++ jeżeli tablica ma rozmiar N to indeksacja jest od 0 do N-1 ?
Sądząc po kodu tego nie wiesz.

0

Temat wlasciwie mozna juz zamknac bo problem rozwiazalem stosujac nieco inna funkcje podana wyzej.

0
ulQuiorra napisał(a):

Temat wlasciwie mozna juz zamknac bo problem rozwiazalem stosujac nieco inna funkcje podana wyzej.

Funkcja podana wyżej to jakiś bubel tymczasowy, działa ona w czasie O(N2)
W bardzo prosty sposób można zrobić funkcje działającą w czasie O(N*log(N)), sortujemy a dalej liniowo.
@Shalom wyżej podał algorytm działający (przynajmniej teoretycznie) w czasie O(N).

Więc nie nazwałbym to rozwiązaniem problemu, co najwyżej załataniem dziury.

0

Fajnie, ale działa więc problem rozwiązany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1