zliczanie elementów tablicy

0

Mamy tablicę reprezentującą kolory RGB + Alpha. Przykładowa tablica reprezentuje 8 kolorów - mogą znajdować się też puste kolory, które należy zignorować.

float tab[] = new float[]{1.0f, 0.0f, 0.0f, 1.0f, //czerwony
0.0f, 0.0f, 0.0f, 0.0f, //pusty kolor
0.0f, 1.0f, 0.0f, 1.0f, //zielony
0.0f, 0.0f, 1.0f, 1.0f, //niebieski
1.0f, 0.0f, 0.0f, 1.0f, //czerwony
0.0f, 0.0f, 1.0f, 1.0f, //niebieski
1.0f, 0.0f, 0.0f, 1.0f, //pusty kolor
0.0f, 0.0f, 0.0f, 0.0f};//pusty kolor

Mam problem z napisaniem funkcji, która zwróci tablicę zawierającą kolor, który wystąpił najczęściej lub jeśli było ich więcej kilka kolorów. W tym wypadku tablica wynikowa powinna zawierać kolor czerwony i niebieski bo wystąpiły najczęściej. Do zrealizowania tego zadania można użyć tylko podstawowych typów danych, nie można posługiwać się kolekcjami typu hash mapa, lista itp.

0

Wydaje mi się, że do Twojego problemu pasują tzw. systemy wyborcze (pierszy strzał np. http://www.algorytm.org/systemy-wyborcze/).
Jeżeli potrzbujesz znaleźć kolor, który występuje najczęściej tzw. lider to proponuje na początek rozwiązanie zadania 12 ze strony
http://wazniak.mimuw.edu.pl/index.php?title=Wst%C4%99p_do_programowania_/_%C4%86wiczenia_2#Zadanie_12_.28G.C5.82osowanie_wi.C4.99kszo.C5.9Bciowe.29 .

Muszę przyznać, że nie do końca rozumiem stwierdzenie

kolor, który wystąpił najczęściej lub jeśli było ich więcej kilka kolorów
,
ponieważ może się zdarzyć, że najczęściej występujących kolorów jest 20 000 i wtedy nie dostaniesz lepszego/ładniejszego algorytmu jak zliczanie liczby
wystąpień w dodatkowej tablicy (to zakładam, że wiesz jak zrobić).
Czy może chodziło Ci o jakieś ograniczenie na liczbę najczęstszych kolorów np. 4-5? (Wyszukaj najczęstszy, a jeżeli było więcej to wybierz tylko 4-5 z nich, ale nie wszystkie).

P.S. Dlaczego pomijasz kolory (0,0,0,0)? Czarny to też kolor i do tego ma prosty wzorzec(przybliżenie) fizyczny http://pl.wikipedia.org/wiki/Cia%C5%82o_doskonale_czarne.

Pozdrawiam

Adam

0
qwert napisał(a)

...
1.0f, 0.0f, 0.0f, 1.0f, //czerwony
....
1.0f, 0.0f, 0.0f, 1.0f, //pusty kolor
....

Jako odróżnić ten pusty od tego czerwonego ?

0

Po pierwsze przepraszam za pomyłkę: {1.0f, 0.0f, 0.0f, 1.0f} *pusty kolor. Oczywiście powinno być {0.0f, 0.0f, 0.0f, 0.0f} *pusty kolor.

Generalnie mam Vertex Buffer Object w OpenGL. Pierwsza połowa przechowuje współrzędne punktów, a druga wartości kolorów RGB + Alpha tych punktów. Tablica, którą napisałem wyżej to jakby wycinek tej części VBO gdzie są przechowywane wartości kolorów. Chodzi o to, żeby dla danego punktu sprawdzić jakie kolory występują najczęściej w jego najbliższym sąsiedztwie (8 sąsiadów). Może się zdarzyć ze będzie jeden dominujący kolor, może być też sytuacja, że dwa kolory dominują, a może być nawet tak, że każdy sąsiad ma inny kolor. Jeśli np kolor czerwony dominuje funkcja powinna zwrócić {1.0f, 0.0f, 0.0f, 1.0f}, jeśli kolor czerwony i niebieski dominują np. występują po 3 sąsiadów niebieskich i 3 czerwonych to wtedy funkcja zwraca {1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f}, a jeśli każdy sąsiad ma inny kolor wtedy jako wynik funkcja zwraca wszystkie kolory, bo każdy dominował ( każdy miał inną wartość).

{0.0f, 0.0f, 0.0f, 0.0f} - to nie jest kolor czarny , tylko po prostu brak koloru dla danego punktu , jeśli punkt ma kolor to jego współrzędna Alpha musi być równa 1.0f. Kolor czarny wyglądał by tak: {0.0f, 0.0f, 0.0f, 1.0f}

0
  1. Tworzysz T(2,N) tablicę dwuwymiarowa liczb całkowitych takiej samej długości N co tablica kolorów drugi wymiar 2
  2. Wypełniasz pierwszy wymiar zerami T(1,I)=0 drugi zaś T(2,I)=I, dla I - 1..N
  3. Pętla po Y - 1..N
  4. Pętla po X - Y+1..N
  5. Jeżeli kolor(Y)=kolor(X) zwiększ T(1,I)
  6. Koniec pętli po X
  7. Koniec pętli po Y
  8. Sortuj T wg pierwszej kolumny malejąco
  9. Zlicz do Count ile elementów T(1,I) jest równych T(1,1) - to będzie rozmiar wyniku.
  10. Indeksy wynikowych kolorów masz w T(2,I) dla I 1..Count

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