logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Algorytm do znalezienia najczęściej występującej liczby w tablicy n-elementowej

autoservice 13 Paź 2007 15:18 1940 7
REKLAMA
  • #1 4374843
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    Witam
    Poszukuję algorytmu, który zwróci mi z tabeli n-elementowej liczbę, która występuje największą ilość razy. Np. mam tablicę 4-elementową z liczbami [5,0,5,5] i jak widać 5 występuje aż 3 razy i taką wartość ma mi zwrócić.
    Próbóję ułożyć jak najszybszy algorytm do tego. Póki co doszedłem do 2 dróg. 1- zakładam, że na 1 pozycji stoi ta szukana liczba i porównuję resztę pozycji z tą liczbą, jeśli chociaż dwie będą takie same to znaczy, że to ta liczba. Jeśli nie to zakładam, że druga pozycja to jest ta liczba...itd.
    2 - sortuję tablicę od max do min i sprawdzam elementy z początku tablicy, tzn ile jest ich takich samych, tylko, że może się wkraść jakiść błąd w tablicy np liczba 30 i lipa...
    Dzięki.
    Pzdr.
    [/b]
  • REKLAMA
  • #2 4374911
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    1/ Sortowanie szybkie + szukanie najdłuższego ciągu. Sortowanie o złożoności O(n log n), szukanie najdłuższego ciągu można zrobić w O(n), co wynika z tego, że ponieważ całość jest posortowana, wystaczą 3 zmienne - aktualnie maksymalna długość wykrytego ciągu, wartość prezentowana przez ciąg i liczba powtórzeń przy skanowaniu (zwiększane jesli kolejny element jest równy, jeśli element różny, to wtedy z założeniami algorytmu przypisuje się liczbę powtórzeń i wartość do wyniku albo nie).
    2/ Jeśli wartości są ograniczone do np jednego bajtu, to wydajny będzie uproszczony algorytm sortowania kubełkowego, potem szukasz kubełka o największej wartości i zwracasz jego index (lub można dokonać aktualizacji w locie przy skanowaniu, ale to nie będzie wydajne przy długich tablicach)
    Aktualnie więcej pomysłów nie mam.
  • REKLAMA
  • #3 4378519
    Sam Sung
    Poziom 33  
    Posty: 2014
    Pomógł: 227
    Ocena: 583
    W przypadku ograniczonego zakresu liczb w tablicy, można zliczyć liczbę wystąpień każdej możliwej wartości (pierwszy etap sortowania pozycyjnego) - czas O(n), gdzie n to długość tablicy - i następnie znaleźć w utworzonej tablicy indeks maksimum - czas O(m), gdzie m to szerokość zakresu.
  • #4 4378530
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    ... w tym sęk, że każda wartość to zakres 0...255 więc za dużo. Ilość elementów w tablicy to 4. Narazie doszedłem do takiego właśnie rozwiązania ale nie sprawdzam każdą z możliwych wartości , lecz tylko te wartości, które mam w tablicy. Czyli biorę pierwszą pozycję z tablicy i sprawdzam ile razy ona występuje, potem drugą pozycję i też sprawdzam ile razy występuje aż do 4 pozycji. Ta która wystąpi najwięcej razy jest poprawna...
    Pzdr.[/url]
  • REKLAMA
  • #5 4378568
    Sam Sung
    Poziom 33  
    Posty: 2014
    Pomógł: 227
    Ocena: 583
    Twój algorytm ma kwadratową złożoność czasową, ale jest prosty, więc jeśli tablica ma zawsze tylko 4 elementy, to chyba nie uda się tego przyspieszyć stosując bardziej wyrafinowane algotytmy. Jedyne proste usprawnienie, jakie mi się nasuwa, to nie przeszukiwanie całej tablicy 4 razy, a tylko podtablicę od n-tego elementu do ostatniego.
    Rozumiem, że program ma być napisany na jakiś mikrokontroler, skoro nie ma miejsca na tymczasową 256-bajtową tablicę?
  • #6 4378845
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    ...dla moich celów mogę go jeszcze uprościć, tzn przy pierwszym sprawdzaniu tj założeniu, że 1 element tablicy jest poprawy i gdy on wystąpi 3x to mogę dalej nie sprawdzać. Do czego mi ten algorytm?...zapisuję jedną daną typu char w eeprom'ie, w jednej komórce. Przypadkiem ta komórka zmieniła wartość (zakłócenia itp) no i lipa urządzenie może stanąć w miejscu.
    Ale gdy zapiszę tą daną w 4 miejsach odległych od siebie o 100 komórek to prawdopodobieństwo, że zostaną zmienione właśnie 4 na raz jest znikome... wystarczy mi nawet, że dwie wartości z tych komórek będą poprawne.
    Mam zamiar dodać też funkcję automatycznego odświeżania jeśli któraś z tych 4 komórek zmieni wartość, własnie na podstawie ilości wystąpień danej z komórek.
    Pzdr.
  • REKLAMA
  • #7 4379378
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Jeśli całość to zawsze 4 komórki, to można dokonać troche optymalizacji:
    - przypadek, kiedy wszystkie 4 komórki mają różną wartość, wtedy algorytm zakończy się niepowodzeniem
    - przypadek, kiedy istnieją 2 komórki o tych samych wartościach. Gdy pozostałe dwie komórki będą między sobą równe, ale o różnej wartości niż pozostałe dwie, algorytm nie będzie mógł dokonać rozróżnienia
    - przypadek, kiedy istnieją 2 komórki o tych samych wartościach, ale pozostałe dwie mają wartości różne między sobą oraz między parą - tutaj istnieje jednoznaczne rozwiązanie
    - przypadek, kiedy istnieją 3 komórki o tych samych wartościach - też jedno rozwiązanie
    - przypadek, kiedy są 4 komórki identyczne
    w uproszczeniu wystarczy znaleźć 2 komórki o tej samej wartości i zwrócić ich wartość: przypadek z 4 i 3 równymi będzie rozpoznany bezbłędnie, przypadki z 2 równymi będą rozpoznane: gdy pozostała para liczb różna - dokładne - gdy pozostała para liczb równa - z błędem, którego nie da się skorygować
    Uproszczenie chyba wystarczające. W kodzie wyglądało by to jakoś tak:
    char repcell(char a, char b, char c, char d)
    {
      if(a==b || a==c || a==d)
        return a;
      if(b==c || b==d)
        return b;
      if(c==d)
        return c;
      // brak dwóch liczb o tej samej wartości..
      return d; // return 0;
    }
  • #8 4380869
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    ...jednak rozwiązałem troszku inaczej, bardziej uniwersalnie... a mianowicie zliczam ile razy w tablicy wystepuje kazda wartosc z tablicy. Rozwiazanie uniwersalne dla dowolnej dlugosci tablicy i najskuteczniejsze...prawie zawsze jednoznacznie okresla, ktora dana wystepuje najwieksza ilosc razy. przy tablicy 10 elementow jest bardzo malo prawdopodobne aby przypadkiem 5 komorek zapisalo sie innymi takimi samymi wartosciami...
    Problem rozwiązany. :D
    Pzdr.

Podsumowanie tematu

✨ Dyskusja dotyczy algorytmu do znalezienia najczęściej występującej liczby w tablicy n-elementowej, na przykładzie tablicy 4-elementowej. Proponowane rozwiązania obejmują: sortowanie szybkie (O(n log n)) z wyszukiwaniem najdłuższego ciągu powtarzających się elementów (O(n)), zliczanie wystąpień wartości przy ograniczonym zakresie danych (np. 0...255) z wykorzystaniem sortowania pozycyjnego lub tablicy zliczającej, oraz prostą metodę iteracyjną sprawdzania liczby wystąpień każdej wartości z tablicy. W przypadku małej tablicy (4 elementy) prosty algorytm o złożoności kwadratowej jest wystarczający. Dyskutowano także o zastosowaniu algorytmu w mikrokontrolerze do zapisu danych w EEPROM w czterech odległych komórkach w celu zwiększenia odporności na błędy zapisu i zakłócenia. Zaproponowano uproszczenia, takie jak zakończenie sprawdzania po znalezieniu wartości występującej co najmniej 3 razy. Omówiono różne przypadki rozkładu wartości w 4-elementowej tablicy i ich wpływ na jednoznaczność wyniku. Ostatecznie autor zastosował uniwersalne rozwiązanie polegające na zliczaniu wystąpień każdej wartości z tablicy, co jest skuteczne i skalowalne dla dowolnej długości tablicy.
Wygenerowane przez model językowy.
REKLAMA