Takze mame mnozinu 7 random bytovych cisel v rozsahu 0-12. Potrebujem najst najjednoduchsi sposob na zistenie zhody t.j. ci je najvacsia zhoda dvojica, trojica, stvorica... alebo vsetkych 7 rovnakych + aka je hodnota cisel v zhode. Logicky to nakodovat viem, ale mam tam prilis komplikovane vyhodnocovanie cez cykly a ukladanie do nahradnych premennych. Neexistuje na to nejaka sikovna funkcia ktora by pohola v takomto vyhodnoteni mnoziny? Zda sa mi ze by take nieco mohlo byt, ale nepodarilo sa mi do googlu poriadne popisat co vlastne chcem, som kruty beginner.
No počkaj, ak som správne pochopil, tak je to trochu jednoduché. Tak si nie som istý, ale predsa napíšem
Urobíš si pole [0..12], incializuješ všetky prvky na nulu a potom lineárne v jednom cykle zvyšuješ pole[aktualny_prvok]++;
Nakonci máš pole [0..12] a na každom indexe číslo, koľko krát v postupnosti bol (ten index - teda číslo)
Akoze nic v zlom, ale typicky priklad Java programatora, na vsetko by chcel funkciu.
Skus sem dat tvoj algoritmus a my ti povieme co sa na nom da vylepsit. Ja osobne, pokial by som vedel ze sa ma jednat len o cisla medzi 0-12, tak by som si spravil len pole fixnej velkosti, kde index v poli by bolo cislo a hodnota prvku v poli by bola prave ta pocetnost cisla.
byte[] hodnoty = new byte[13];
Cisla mnozina = new Cisla();
for(byte i=0; i<7; i++)
{
//toto len z vacsej mnoziny vrati byte a pichne ho do tejto 13 clennej mnoziny
hodnoty[mnozina.vyberZcisel()]++;
}
byte pocetnost, velkost;
pocetnost=velkost=0;
for(byte j=0; j<13; j++)
{
if (hodnoty[j]>pocetnost)
{
velkost=j;
pocetnost=hodnoty[j];
}
}
Tak sa dopracujem k najpocetnejsiemu cislu v mnozine a jeho hodnote, lenze potom musim nejakym sposobom odignorovat toto cislo a hladat druhe najpocetnejsie a tak dalej. Neexistuje nic jednoduchsie?
Zhoduje sa skôr menej ako viac. Prečítaj si to znovu.
btw. toto som nepochytil, čo znamená hodnoty[mnozina.vyberZcisel()]++;, mohol by si to vysvetliť? (Toto nemierim ako výčitku, vážne som to nepochopil. Alebo potom nechápem, čo vlastne chceš)
To neries, to len tych 7 cisel generujem nahodnym vyberom z inej mnoziny (triedy Cisla()), priznavam, ze som to sem skopcil zbytocne, je to nepodstatne. Podstatne je len toto:
Potom ostava iba hodnoty[pocetnost] vynulovat a prehnat cyklom este tolkokrat, kym nie je pole hodnoty cisto nulove. A pointou je, ze hladam rychlejsi sposob.
No podstatné to je, lebo mne to príde takto:
Máš množinu (objekt typu Cisla - takisto neviem, ako môže fungovať to new cisla(), keď java je case sensitive, ale javu neviem, nechám tak)
Máš pole 13 bytov(nazvyme to čísel). Toto pole sa správa ako bitová mapa - indexuješ číslami z množiny a koľko krát ti tam číslo padne, taká hodnota bude v poli hodnoty. Pole hodnoty nikde neinicializuješ na nuly, ale predpokladám, že java to urobí za teba. Takisto predpokladám, že v množine sú len čísla od 0 do 12, lebo inak by si šiel cez dĺžku pola.
Máš pole 13 čísel, ktoré vyzerá napríklad takto:
index 0 = 0 (0 tam nie je ani raz)
index 1 = 2 (1 je tam dva krát)
index 2 = 1 (dvojka je tam raz)
atď.
A ty chceš zistiť početnosti jednotlivých čísel v poli hodnôt. Teda tie početnosti, ktoré tam máš už od začiatku. Následne tam hľadáš klasicky maximum.
Wtf? Kde som čo prehliadol, čo zas nechápem?
1. Ano java je case sensitive, ale prepisoval som triedy na viacvraviace nazvy, nie len take ktorym rozumiem ja a uslo mi tam to velke C
2. Ano v mnozine su cisla 0-12
3. Ano presne tak, hladam najpocetnejsi prvok a funkcia co som pisal mi vrati najpocetnejsi prvok + jeho hodnotu(sry ze som skopcil len telo fcie). Po vyhodnoteni ktory prvok je najpocetnejsi vynulujem najpocetnejsie cislo a idem zas. Vrati mi druhy najpocetnejsi prvok, nulujem a tak dalej az kym pole nie je uplne nulove. Je to funkcne no na jednoduchost toho co chcem mi pride ten kod dost komplikovany. Ak jednoduchsia cesta nie je budem sa s tym musiet zmierit.
Noo, tak to mení situáciu.
Blbé je, že každá hodnota má aj svoj kľúč (index) a je s ním spojená. Ak by si tieto dve veci hodil k sebe (do nejakej štruktúry), mohol by si hodnoty jednoducho zoradiť (zložitosť by klesla z n*n na n*log(n), pri malých poliach, ako máš ty, v priemere ešte menej)
Ak to ale bude mať stále takto málo hodnôt, kľudne to rob tak, ako popisuješ. Tomu programu to neublíži.
BX napísal:Blbé je, že každá hodnota má aj svoj kľúč (index) a je s ním spojená. Ak by si tieto dve veci hodil k sebe (do nejakej štruktúry), mohol by si hodnoty jednoducho zoradiť (zložitosť by klesla z n*n na n*log(n), pri malých poliach, ako máš ty, v priemere ešte menej)
Vedel by si to prosim ta nejako podrobnejsie popisat? Ako som spominal som kruty zaciatocnik. Toto budem vyhodnocovat totiz niekolko milionov raz, takze akekolvek odlahcenie kodu mi ziska cas.
Ze si vytvori novu triedu, ktora bude obsahovat 2 clenov a to cislo a pocetnost, pricom ich najprv budes indexovat cez to cislo ako doteraz, avsak potom spravis este to ze si modifikujes napriklad quicksort, alebo iny rychly triediaci algoritmus, aby si si ich zoradil.
Ak by to malo byť extra efektívne, bolo by to treba začať riešiť už pri vkladaní, nie až potom. Takže sa pýtam, vždy to bude pole do 20 prvkov? Alebo ich tam bude niekedy trebárs aj milión?
(S efektivitou samozrejme klesá jednoduchosť!)
Prvkov bude vzdy 7 a vzdy hodnoty 0..12. Tych 7 prvkov vsak musim nahodne vybrat (zakazdym) z vacsej mnoziny byte[52] kde su podla istej logiky zoradene s tym nepohnem.
Tak podľa mňa to môžeš kľudne nechať tak, ako píšeš s menšou optimalizáciou - nájdeš si minimum a potom hľadáš aktuálne maximum len dovtedy, kým nenarazíš na minimum (minimum si môžeš samozrejme nájsť spolu s maximom v jednom cykle - takže napr. v tom prvom)
Ak by si chcel byť veľmi hustý, tak si to hoď do štruktúry (ako písal metthal), ale radil by som to insertion sortom, alebo optimalizovaným bubble sort/shaker sortom (lepšie a jednoduchšie než quick sort)