Modalna - funkcja nie zwraca poprawnego wyniku

Modalna - funkcja nie zwraca poprawnego wyniku
ulQuiorra
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:25
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:

Kopiuj
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?

edytowany 2x, ostatnio: ulQuiorra
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:10 dni
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
szweszwe
Serio to nie zwraca zawsze '-1' tak jak pisał autor?
ulQuiorra
szweszwe niewiem jak w wypadku innych danych, ale na podstawie moich tablic nawet jesli probowalem nieco je pozmieniac zawsze pokazywalo -1. nie mam pojecia dlaczego ;/
_13th_Dragon
Serio, tylko że ilość nie ilość tylko ostatni element. I oczywiście musi być ponad połowę: double Tb[]={7,333,333,3,333,4,333}; cout&lt;&lt;modalna(6,Tb)&lt;&lt;endl;
szweszwe
Rzeczywiście, ostatni element zauważyłem, połowy już nie. :]
ulQuiorra
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:25
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:

Kopiuj
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 ?

Resident
  • Rejestracja:prawie 16 lat
  • Ostatnio:ponad rok
  • Postów:195
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ą.

...
edytowany 2x, ostatnio: Resident
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:10 dni
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
ulQuiorra
odnosnie indeksowania wiem, zapomnialem poprawic na samo "<". N jest to rozmiar tablicy zadeklarowany przed programem glownym, sa 2 rozne rozmiary N i M dla obu tablic. deklaracje tablicy mam na 100% poprawna.
ulQuiorra
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:25
0

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

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:10 dni
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
ulQuiorra
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:25
0

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

Zobacz pozostałe 7 komentarzy
_13th_Dragon
No tak, całkowita racja, przecież powiedziano: - "Nie rzucajcie pereł przed wieprzy".
ulQuiorra
warto odpisywac na temat a wy ewidentnie piszecie nie na temat :)
ulQuiorra
nastepnym razem odpisuj zgodnie z tematem a nie wg tego co ci sie podoba. to nie jest forum dla programistow z wieloletnim stazem dla ktorych napisanie programu to kilka linii kodu. no chyba ze jednak jest to forum dla takich ludzi to powinno byc tu conajmniej 3/4 uzytkownikow mniej :)
_13th_Dragon
No proszę, miesiąc na forum i już decyduje dla kogo ten forum ma być. Dla tablicy w milion elementów twoja funkcja będzie milion razy wolniejsza od tego co zaproponował @Shalom oznacza to że zamiast sekundy będzie działać prawie 12 dni, rzecz jasna że po godzinie pracy funkcji prawie każdy stwierdzi że funkcja niczego nie zwraca czy jakoś tak. Więc to jest dokładnie na temat.
ulQuiorra
jestem moze tydzien na forum :) i tak mowie bo taka prawda zachowujesz sie jakby kazdy byl tu asem. mnie nie interesuje dla miliona danych w tablicy czlowieku ty zamiast prgoramowac idz na nauke "rozumowania" bo nawet nierozumiesz tego o czym do ciebie mowie. zlozonoscia obliczeniowa bede sie martwil pozniej kiedy do tego dojdziemy na zajeciach teraz mnie interesuje wylacznie zrobienie tego co mi zadano wg tego co do tej pory mielismy na zajeciach. pomysl troche czlowieku POMYSL.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.