Java - analyza pola cisel

Programovacie jazyky, rady, poradňa...
mi-chau
Darca
Darca
Používateľov profilový obrázok
Príspevky: 5858
Registrovaný: 14 jan 2007, 22:52

Java - analyza pola cisel

Príspevok od používateľa mi-chau »

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.

Kód: Vybrať všetko

priklad mnozina: 1,5,3,5,5,5,1
vrati:
4(stvorica) - 5 
2(dvojica) - 1
1 -3
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java - analyza pola cisel

Príspevok od používateľa BX »

No počkaj, ak som správne pochopil, tak je to trochu jednoduché. Tak si nie som istý, ale predsa napíšem :D

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)
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: Java - analyza pola cisel

Príspevok od používateľa metthal »

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.
mi-chau
Darca
Darca
Používateľov profilový obrázok
Príspevky: 5858
Registrovaný: 14 jan 2007, 22:52

Re: Java - analyza pola cisel

Príspevok od používateľa mi-chau »

Ano iste, kod vyzera nejako takto:

Kód: Vybrať všetko

       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?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java - analyza pola cisel

Príspevok od používateľa BX »

A čítal si tie dva príspevky, ktoré sme tu napísali?
mi-chau
Darca
Darca
Používateľov profilový obrázok
Príspevky: 5858
Registrovaný: 14 jan 2007, 22:52

Re: Java - analyza pola cisel

Príspevok od používateľa mi-chau »

Cital, preco? Moj kod sa viacmenej zhoduje s tym co si pisal. Zaujima ma ci sa da urobit jednoduchsie.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java - analyza pola cisel

Príspevok od používateľa BX »

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š)
mi-chau
Darca
Darca
Používateľov profilový obrázok
Príspevky: 5858
Registrovaný: 14 jan 2007, 22:52

Re: Java - analyza pola cisel

Príspevok od používateľa mi-chau »

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:

Kód: Vybrať všetko

 byte pocetnost, velkost;
       pocetnost=velkost=0;
       
       for(byte j=0; j<13; j++)
       {
           
           if (hodnoty[j]>pocetnost)
           {
                 velkost=j;
                 pocetnost=hodnoty[j];
           }
       }
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.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java - analyza pola cisel

Príspevok od používateľa BX »

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?
mi-chau
Darca
Darca
Používateľov profilový obrázok
Príspevky: 5858
Registrovaný: 14 jan 2007, 22:52

Re: Java - analyza pola cisel

Príspevok od používateľa mi-chau »

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.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java - analyza pola cisel

Príspevok od používateľa BX »

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.
mi-chau
Darca
Darca
Používateľov profilový obrázok
Príspevky: 5858
Registrovaný: 14 jan 2007, 22:52

Re: Java - analyza pola cisel

Príspevok od používateľa mi-chau »

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.
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: Java - analyza pola cisel

Príspevok od používateľa metthal »

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.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java - analyza pola cisel

Príspevok od používateľa BX »

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ť!)
mi-chau
Darca
Darca
Používateľov profilový obrázok
Príspevky: 5858
Registrovaný: 14 jan 2007, 22:52

Re: Java - analyza pola cisel

Príspevok od používateľa mi-chau »

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.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Java - analyza pola cisel

Príspevok od používateľa BX »

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)
intelygent
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 55
Registrovaný: 04 feb 2007, 20:43

Re: Java - analyza pola cisel

Príspevok od používateľa intelygent »

ak hladas sikovnejsiu funkciu skus to vyriesit cez kolekcie typu map s implemetaciou HashMap a vyriesene to mas par riadkami
Napísať odpoveď