[ iizuzetan @ 23.03.2009. 02:03 ] @
Na primer imamo sledece nizove:

Code:

$ime[1]='Ana';
$ocena[1]=6;

$ime[2]='Bilja';
$ocena[2]=8;

$ime[3]='Dejan';
$ocena[3]=7;

$ime[4]='Sasa';
$ocena[4]=5;

$ime[5]='Laza';
$ocena[5]=9;

$ime[6]='Maza';
$ocena[6]=10;


Kao sto vidimo niz $ime je nasumican a cilj nam je da ga uredimo tako da na indeksu 1 bude ime sa najvecom ocenom, znaci Maza, a na indeksu 6 da bude ime sa najmanjom oceno, to jest ime Sasa. Drugim recima napraviti skriptu koja ce urediti niz $ime po opadajucim vrednostima ocena niza $ocena tako da se dobije sledeci niz:

Code:

$ime[1]='Maza';
$ime[2]='Laza';
$ime[3]='Bilja';
$ime[4]='Dejan';
$ime[5]='Ana';
$ime[6]='Sasa';
[ Nemanja Avramović @ 23.03.2009. 09:32 ] @
Ja bih ti preporučio da i imena i ocene držiš u jednom višedimenzionalnom nizu, a zatim da iskoristiš funkciju uasort() kako bi taj isti niz sortirao.

Funkcija kao prvi argument prihvata niz koji se sortira, a kao drugi argument funkciju koja definiše način na koji se niz sortira.

http://php.net/uasort

Pogledaj primere na ovom linku gore, ne bi trebalo da imaš problema sa ovim.
[ iizuzetan @ 23.03.2009. 10:47 ] @
Citat:
Nemanja Avramović: Ja bih ti preporučio da i imena i ocene držiš u jednom višedimenzionalnom nizu, a zatim da iskoristiš funkciju uasort() kako bi taj isti niz sortirao.

Funkcija kao prvi argument prihvata niz koji se sortira, a kao drugi argument funkciju koja definiše način na koji se niz sortira.

http://php.net/uasort

Pogledaj primere na ovom linku gore, ne bi trebalo da imaš problema sa ovim.


Vidi ok je to da se ima mogucnost visedimenzionog niza. Medjutim po nekad niz se ne "pravi" na "jednom" mestu pa da ga direktno napravimo kao visedimenzionalni, vec se "prave" dva jednodimenzionalna niza na dva razlicita mesta, a ipak trebamo da na osnovu vrednosti jednog niza sortiramo drugi (kao u nasem primeru). E sad tvoja ideja da se napravi prvo od ta dva niza jedan visedimenzioni niz, pa zatim ga sortirati, i posle toga ga opet rasclaniti na dva niza itd itd mi se cini jako neekonomicnim kako u ustedi vremena izvrsenja skripte tako i u velicini skripte.

Evo na primer ajde napravi ti skriptu kako znas i umes pomocu jednog visedimenzionalnog niza ali da na kraju imas kao rezultat sortiran po opadajucim vrednostima ocena niz $ime !!! A posle toga cu ja napisati skriptu koja direktno dolazi do sortiranog po ocenama niza $ime. I na kraju videcemo koja je ekonomicnija skripta po duzini i vremenu izvrsenja KODA, tvoja ili moja !!! Nadam se da ces prihvatiti izazov, kao i ostali koji citaju ovu temu. :) :) :)
[ dakipro @ 23.03.2009. 10:54 ] @
A mogo bi i sam da lepo napises taj kod ako vec znas kako treba da radi, i resis sam sebi problem

A odakle god da se niz pravi iz vise delova, ako se drzis jedinstvenih idjeva kao kljuceva nemoz imati nikakvih problema, odmah pravis multidimenzionalni niz i picis sa jednim nizom.
Onda nemoz ekonomicniji kod jer je uasort mnogo optimizovanija i brza od bilokoje petlje koju korisnik napise a da radi isti posao.
[ Nemanja Avramović @ 23.03.2009. 11:05 ] @
Ako i posle ovoga što je dakipro napisao ne veruješ da je uasort() bolje (brže, preglednije) rešenje, prihvatam izazov

S tim što upravo krećem na fax tako da ćeš morati da čekaš do večeras ili sutra za kod.

Imao sam sličan problem pre par godina (sortiranje hall of fame (u nekoj igrici) liste po broju poena) i znam da sam dosta vremena izgubio izmišljajući načine za sortiranje, sve dok mi neko (flylord ja mislim) nije ukazao na uasort() funkciju
[ iizuzetan @ 23.03.2009. 11:12 ] @
Citat:
dakipro: A mogo bi i sam da lepo napises taj kod ako vec znas kako treba da radi, i resis sam sebi problem :D

A odakle god da se niz pravi iz vise delova, ako se drzis jedinstvenih idjeva kao kljuceva nemoz imati nikakvih problema, odmah pravis multidimenzionalni niz i picis sa jednim nizom.
Onda nemoz ekonomicniji kod jer je uasort mnogo optimizovanija i brza od bilokoje petlje koju korisnik napise a da radi isti posao.


Ok vidim da niste raspolozni za mozganje :) pa cu dati resenje. A i kad vidis resenje nadam se da ces promeniti misljenje da su samo "gotove funkcije" brze :)

Code:

<?
// ZADAVANJE VREDNOSTI NIZOVA:
$ime[1]='Ana';
$ocena[1]=6;

$ime[2]='Bilja';
$ocena[2]=8;

$ime[3]='Dejan';
$ocena[3]=7;

$ime[4]='Sasa';
$ocena[4]=5;

$ime[5]='Laza';
$ocena[5]=9;

$ime[6]='Maza';
$ocena[6]=10;


//KLUCNA SKRIPTA KOJA SORTIRA NIZ $ime U ZAVISNOSTI OD VREDNOSTI NIZA $ocena:
for($a=1;$a<=6; $a++){
    for($b=1;$b<=6; $b++){
          if($ocena[$b]<$ocena[$a]) {
               $u=$ocena[$a];$t=$ime[$a];
               $ocena[$a]=$ocena[$b];$ime[$a]=$ime[$b];
               $ocena[$b]=$u;$ime[$b]=$t;
          } 
    }
}

//LINIJA KODA KOJA ISCITAVA REZULTAT:
for($a=1;$a<=6; $a++){
     echo '$ime['.$a.']->'.$ime[$a].'<br>';
}


/*******************
*****  REZULTAT  ***
*******************

$ime[1]->Maza
$ime[2]->Laza
$ime[3]->Bilja
$ime[4]->Dejan
$ime[5]->Ana
$ime[6]->Sasa

*******************/
?>


Poenta cele price je ta da ako su indexi oba niza isti onda nizove mozemo sortirati kako nam je volja. Ako nisu isti onda moramo napraviti da su isti.

[Ovu poruku je menjao iizuzetan dana 23.03.2009. u 14:27 GMT+1]
[ dakipro @ 23.03.2009. 11:37 ] @
Kako si vec voljan da siris iskustva, uradi to sad isto kao sto ti je Nemanja napisao, pa proveri na tom prostom primeru vreme i resurse potrebne za oba primera, okaci oba primera ovde da mozemo i na drugim masinama da testiramo, sad i mene zanima kako bi to radilo u praksi , al nemogu danas nikako da se macujem sa tim.
[ iizuzetan @ 23.03.2009. 12:46 ] @
Citat:
dakipro: Kako si vec voljan da siris iskustva, uradi to sad isto kao sto ti je Nemanja napisao, pa proveri na tom prostom primeru vreme i resurse potrebne za oba primera, okaci oba primera ovde da mozemo i na drugim masinama da testiramo, sad i mene zanima kako bi to radilo u praksi :) , al nemogu danas nikako da se macujem sa tim.


Vidi, mislim da nije potrebno praviti od ta dva jednodimenzionalna niza jedan visedimenzionalni pa ga sortirati, a posle toga ga opet rasclaniti, jer je ocigledno vreme koje je potrebno za rezultat vece. Nego ajde da dokazem.

Ja sam, kao sto vidimo utrosio vreme potrebno za izvrsenje dve for petlje. Znaci moje vreme utroseno je VREME(bez uasort)=2 [for petlja].

A ajde sad da izracunamo ovako odokativno koliko nam je potrebno vreme u slucaju koriscenja uasort() funkcije:

- Prvo treba napraviti od ova dva jednodimenzionalna niza jedan visedimenzionalni. To znaci da nam je potrebno za to najmanje jedna for petlja. Znaci: VREME(uasort)1=1 [for petlja].
- Zatim sortirati taj dvodimenzionalni niz funkcijom uasort(). E sad koliko god da je optimizovana ta funkcija i njoj resenja ne padaju sa neba vec i unutar nje mora posojati najmanje dve for petlje kako bi prosla kroz oba indeksa i uporedila njihove vrednosti kako bi ih sortirala. Znaci minimum dve for petlje stim da ce mo racunati kao jednu ipo for petlju, jer eto mozda je optimizovanije i direktnije. Znaci vreme izvrsenja ovog dela skripte racunacemo kao: VREME(uasort)2=1.5 [for petlja].
- Zatim, potrebno je opet rasclaniti taj dvodimenzionalni niz i izvuci iz njega jednodimenzionalni niz $ime, sto opet iziskuje minimum jednu for petlju, mada ne verujem da moze samo jedna ali ajde. Pa imamo: VREME(uasort)3=1 [for petlja].

Rezime:
Pomocu uasort() funkcije je: VREME(uasort)=VREME(uasort)1 + VREME(uasort)2 + VREME(uasort)3 = 1+1.5+1= 3.5 [for petlja].
Neko ce reci pa zasto da rasclanjujemo, moze da se koristi u daljem radu taj dvodimenzionalni niz. OK u tom slucaju potrebno nam je: VREME(uasort)=VREME(uasort)1 + VREME(uasort)2 = 1+1.5= 2.5 [for petlja].

A da potsetim moja skripta se izvrsava brzinom: VREME(bez uasort)=2 [for petlja].

Samo da napomenem na kraju da se brze program izvrsava kad se u njemu koriste jednodimenzionalni nizovi nego kad se koriste dvodimenzionalni ili visedimenzionalni. Zato je mja preporuka kad god mozete koristite jednodimenzionalne nizove pa cak i po ceni da vam je skripta duza i glomaznija.
[ dakipro @ 23.03.2009. 13:04 ] @
Vidim da si se potrudio da napises silan text, pa necu biti grub i reci da lupas.
Ajde uzmi ti to i prakticno napsi, jer su ovo sad babe i zabe sto si ti napisao.
Naime, totalno ti je pogresan pristup da pises dva niza pa da ih spajas, receno je da napravis jedan multidimenzionalni niz u startu, to je logicniji i prakticniji pristup, da relevantne podatke drzis na jednom mestu.
Znaci, odma otpada tvoja teorija u startu, pa onda ispade da po tvojoj matematici je tvoj pristup sporiji jer nema jedne petlje
Drugo, petlja koja je u generic funkciji JESTE brza od iste te petlje koju ti napises, zato sto nije potrebno parsiranje i jos gomila stvari koju php uradi sa user kodom, vec samo izvrsi tu funckiju bez prevodjenja iz skripte i sta-ti-ja-znam jos cega, o tome mozes proguglati malo i videti zasto i kako je tako.

Drugo, kad bi se ovako 'teorijski' racunalo vreme izvrsenja funkcija, mnoooooge bi stvari pale u vodu, ali mi se svidja tvoj nacin razmisljanja, 'odokativno'
I savet, vodi racuna sta pises i sta savetujes na forumu, jer kada nekad u buducnosti budes trazio posao i ljudi malo proguglaju o tebi, sigurno ce doci ovde, i kad klijent (poslodavac) vidi principe kojima ti optimizujes kod, ne znam kako ce reagovati

Znaci uzmi iscupaj sam sebe sad, NAPISI kod u editoru, stavi ga u fajl i koristi funckije za merenje vremena i zauzeca memorije, ali odistinski, ne 'teorijski'
Onda ako to bude bilo kao sto si ti napisao, taman si dokazao i svoju teoriju pa nemas oko cega da se brines
[ iizuzetan @ 23.03.2009. 13:13 ] @
Citat:
dakipro: Vidim da si se potrudio da napises silan text, pa necu biti grub i reci da lupas.
Ajde uzmi ti to i prakticno napsi, jer su ovo sad babe i zabe sto si ti napisao.
Naime, totalno ti je pogresan pristup da pises dva niza pa da ih spajas, receno je da napravis jedan multidimenzionalni niz u startu, to je logicniji i prakticniji pristup, da relevantne podatke drzis na jednom mestu.
Znaci, odma otpada tvoja teorija u startu, pa onda ispade da po tvojoj matematici je tvoj pristup sporiji jer nema jedne petlje :)
Drugo, petlja koja je u generic funkciji JESTE brza od iste te petlje koju ti napises, zato sto nije potrebno parsiranje i jos gomila stvari koju php uradi sa user kodom, vec samo izvrsi tu funckiju bez prevodjenja iz skripte i sta-ti-ja-znam jos cega, o tome mozes proguglati malo i videti zasto i kako je tako.

Drugo, kad bi se ovako 'teorijski' racunalo vreme izvrsenja funkcija, mnoooooge bi stvari pale u vodu, ali mi se svidja tvoj nacin razmisljanja, 'odokativno' :D
I savet, vodi racuna sta pises i sta savetujes na forumu, jer kada nekad u buducnosti budes trazio posao i ljudi malo proguglaju o tebi, sigurno ce doci ovde, i kad klijent (poslodavac) vidi principe kojima ti optimizujes kod, ne znam kako ce reagovati ;)

Znaci uzmi iscupaj sam sebe sad, NAPISI kod u editoru, stavi ga u fajl i koristi funckije za merenje vremena i zauzeca memorije, ali odistinski, ne 'teorijski' ;)
Onda ako to bude bilo kao sto si ti napisao, taman si dokazao i svoju teoriju pa nemas oko cega da se brines :)



Vidi vec sam gore napisao ali ajd opet. Postoje slucajevi da se u toku pisanja skripte (ili celog programa) javljaju na razlicitim mestima kao resenja neki nizovi. Znaci nije uvek moguce napraviti ili dobiti na jednom mestu odjednom gotov visedimenzionalni niz !!.

Ja sam ispisao skriptu koja resava problem sa pocetka teme. E sad ja ne kazem da je to idealno resenja, ali ti napisi bolji KOD koji je brzi pa makar i sa tom tvojom uasort() funkcijom u koju se zaklinjes, i ako dokazes da je tvoj KOD brzi tek onda prihvatam sve tvoje kritike. Ovako "lajes" bez argumenata praznom pricom, sto mislim da nije fer.

Jos napisao si da uzimam dva niza pa da ih spajam. Koliko vidim ja nigde u mom resenju nisam spajao dva niza u jedan !!! Pa upravo je i to poenta price da prodjemo kroz dva nezavisna niza i da jedan od njih uredimo u zavisnosti od vrednosti drugog a da ih ne spajamo.

A odgovor na pitanje koliko sam strucan ili ne ako nekog zanima, sigurno nece traziti po forumima vec ce pitati licno mene koje sam to sajtove napravio, kako bi se uverio u konkretne stvari.

Jos napisao si da je moje resenje sporije jer ima jednu petlju manje. Neznam da li si pogresio u pisanju ili stvarno mislis da kad imas vise petlji u skripti da ti je skripta brza???

Zatim napisao si "petlja koja je u generic funkciji JESTE brza od iste te petlje koju ti napises". Naravno slazem se sa tobom ali moraces i ti da se slozis da koliko god da je brze nije duplo brze. Doduse nikad nisam merio ali ne verujem da je gotova funkcija duplo brza od skripte koja ima identicni KOD.

[Ovu poruku je menjao iizuzetan dana 23.03.2009. u 14:47 GMT+1]
[ Man-Wolf @ 23.03.2009. 13:45 ] @
A da vi jednostavno uzmete oba primera i date rezultate ovde ? Ovakva rasprava moze da traje do sutra, a poente nema, samo se kvari tema.
[ dakipro @ 23.03.2009. 13:45 ] @
To sto postoje takvi slucajevi, to ti je greska u startu.
Znaci tu si lose poceo sa programiranjem u startu, a ti odakle god da pravis taj niz, uvek ga mozes kasnije popunjavati, evo i da naucis neke fore:
Code:

$mixedNiz = array(); // ovo radis da bi definisano promenjivu
.
.
.//neki kod u toku skripte
.

$mixedNiz[$id]['ime'] = 'Dejan'; //id menjas po potrebi
.
.//neki kod u toku skripte
.
.
$mixedNiz[$id]['ocena'] = 7;


Kada si u funckiji, onda koristis 'global' da bi tom nizu pristupio unutar funckije, kao i unutar metoda, ili ga prosledis metodama i funkciji, pogledaj i to kako se radi, posto vidim da ti oop nije jaca strana.

Znaci ovako se popunjava multidimenzionalni niz sa vise mesta, probaj malo da radis sa nizovima, procitaj manual i vidi neke primere, prosto je

A sto se 'dokazivanja' tice, kod retko kad pisem za dz, a pogotovo nekom da bi nesto dokazao kome to i ne treba, jer je ocigledno da si temu postavio kako bi pokazao kako ti znas resenje na 'zagonetne' probleme sortiranja nizova (mada, ocigledno je neko tu zagonetku resio daleko pre tebe, cak je i napisao funkciju i ljudi su je integrisali u sam php), ali dobro, kazem, sve je to pod tvojim potpisom

Deluje mi da si se uvredio nesto, ne vidim sto, samo sam ti dao lepo savet sta i kako da radis, ali dobro, svakome sujeta drugacije reaguje
Prilicno je neumesno da kazes nekom da 'laje', ali opet ok, stvar vaspitanja.
Od argumenata ovde imam jedino neko skromno iskustvo, ali verujem Nemanji (dosta iskustva) jer znam da je dobar u onome sto radi, a jos vise verujem i Flylordu (mnooooogo iskustva) koji je to i savetovao Nemanju, ali dobro, opet stoji da nisu neki argumenti, zato sam ti i reko da probas i da vids

A oko toga ko gde proverava ljude i kako, znam da kad god su firme za koje radim zaposljavale ljude, uvek smo proveravali i radove i kod sa testovima, a i bogami i forume i google, ali dobro, posto tebi u potpisu stoji 'Nezaposlen' verovatno imas svoju teoriju o tome da sigurno nece traziti po forumima.
Ljudi danas prvo pitaju google pa gledaju oko sebe.

Nemoj da se ljutis, nije mi bila namera da ti povredim sujetu, samo sam 'teo da ti pomognem najvise sto mogu. Sad bas da ti objasnjavam kako se prakticno meri vreme skripte i zauzece memorije i pisem i kod, stvarno me mrzi...

No, drzimo se teme i pravilnika, tj konkretnog problema


@ Man-Wolf, u pravu si, nadam se da ce Nemanja imati vremena kasnije, taman je on radio nesto slicno
[ Man-Wolf @ 23.03.2009. 13:47 ] @
Btw, @iizuzetan, sta se desava u slucaju da postoje dve osobe sa istom ocenom ? :-) Drugo, probaj da nadjes neko univerzalno resenje, jer je ovo tvoje samo za primer kad imamo 6 elemenata u nizu, pa onda daj rezultate brzine izvrsavanja :-)

P.S. Nemoj da shvatas ovo kao kritiku, vec kao ideju :-)
[ iizuzetan @ 23.03.2009. 14:12 ] @
Citat:
Man-Wolf: Btw, @iizuzetan, sta se desava u slucaju da postoje dve osobe sa istom ocenom ? :-) Drugo, probaj da nadjes neko univerzalno resenje, jer je ovo tvoje samo za primer kad imamo 6 elemenata u nizu, pa onda daj rezultate brzine izvrsavanja :-)

P.S. Nemoj da shvatas ovo kao kritiku, vec kao ideju :-)


Ne, ne shvatam kao kritiku. Pa vidi ovde sam uzeo 6 elemenata da bi bilo razumljivije sta hocu da kazem. A nista ne menja na stvar (to jest ne menja skriptu) ako imamo i 1 000 000 elemenata oba niza. Jedino sto tad itekako je bitno vreme za koje se izvrsi skripta.
Pitanje sta bi se desilo da su oba uporedjene ocene iste kod dva razlicita imena. Pa ovako konkretno u mom resenju na manjem indeksu ce biti ime koje je bilo na manjem indeksu u nizu $ime pre sredjivanja. E sad ako zelis to da promenis ona umesto "<" stavis "<=".
Drugo, kaze u startu sam pogresno zapoceo skriptu pa sam upao u situaciju da mi se pojavljuju dva jednodimenzionalna niza u razlicitim delovima programa. Vidi ovako, ako pravis sajt klasican koji jedino sto radi je da prikuplja podatke sa sajta kroz forme, ucitava te podatke u bazu i iscitava podatke po potrebi iz baze, donkle malo ih obradi u par reda i ispisje ih u HTML KODU, onda verovatno se i nikad nece javiti bas neki slozeni medjurezultati u izvrsenju skripte. Medjutim ako imas sajtove na cijim pojedinim stranicama imas slozenije aktivnosti kao sto su neke PHP igre, ili neke slicne PHP aplikacije onda itekako se javljaju vrlo slozena medjuresenja pa i u vidu jednodimenzionalnih nizova. Neko ce reci ajde te igre pravi u JAVA ili slicno ali i tamo se javljaju nizovi a ja sam ovde izneo princip koji se moze primeniti u bilo kom jeziku koji ima mogucnost obrade nizova a ne samo PHP.
[ Nikola Poša @ 23.03.2009. 15:59 ] @
Kome, čemu i zašto sve ovo...

Nisam čitao sve poruke, pročitao sam samo prvu, i evo mislim da bi neki prost algoritam za taj tvoj problem mogao da izgleda ovako:
Code:

for ($i = 1; $i <= count($ime) - 1; $i++) {
    for ($j = $i + 1; $j <= count($ime); $j++) {
        if ($ocena[$i] < $ocena[$j]) {
            $temp = $ime[$i];
            $ime[$i] = $ime[$j];
            $ime[$j] = $temp;
            
            $temp = $ocena[$i];
            $ocena[$i] = $ocena[$j];
            $ocena[$j] = $temp;
        }
    }
}    

I stvarno ne znam što si napravio toliku dramu od svega ovoga...

[Ovu poruku je menjao Nikola Poša dana 23.03.2009. u 17:18 GMT+1]
[ Nikola Poša @ 23.03.2009. 16:18 ] @
btw Sad sam malo čitao poruke na ovoj temi, pa pošto vidim da voliš da teoretišeš, ovaj algoritam kojim sam ja napisao u prethodnoj poruci se zove metoda izbora.

Evo ti još nekih metoda za sortiranje nizova, pa ti prouči koji ima najbolji (najbrži) algoritam:

Metoda izbora 2
Code:

$n = count($niz);

for ($i = 0; $i < $n-1; $i++) {
    $m = $i;
    for ($j = $i + 1; $j < $n; $j++) {
        if ($niz[$j] < ($niz[$m])) 
        {    
            $m = $j;
        }
        if ($m != $i)
        {
            $p = $niz[$i]; 
            $niz[$i] = $niz[$m]; 
            $niz[$m] = $p;
        }
    }
}


Metoda umetanja
Code:

$n = count($niz);
    
for ($i=0; $i < $n; $i++) {
    $j = $i - 1;
    while ($j >= 0 && $niz[$j+1] < ($niz[$j]))
    {
        $p = $niz[$j+1]; 
        $niz[$j+1] = niz[$j]; 
        niz[$j--] = $p;
    }
}


Metoda zamene suseda
Code:

$n = count($niz);

$dalje = true;
for ($i = 0; $i < $n-1 && $dalje; $i++){
    $dalje = false;
    for ($j = $n-2; $j >= $i; $j--) {
        if ($niz[$j+1]<($niz[$j]))
        {
            $p = $niz[$j+1];
            $niz[$j+1] = $niz[$j]; 
            $niz[$j] = $p;
            $dalje = true;
        }
    }
}


I verovatno pod nekim od ovih algoritama i rade te f-je za sortiranje nizova u PHP-u, tako da ovo što ti pokušavaš da izvedeš je samo "izmišljanje tople vode"...

[Ovu poruku je menjao Nikola Poša dana 23.03.2009. u 17:35 GMT+1]
[ iizuzetan @ 23.03.2009. 16:31 ] @
Citat:
Nikola Poša: Kome, čemu i zašto sve ovo... :)

Nisam čitao sve poruke, pročitao sam samo prvu, i evo mislim da bi neki prost algoritam za taj tvoj problem mogao da izgleda ovako:
Code:

for ($i = 1; $i <= count($ime) - 1; $i++) {
for ($j = $i + 1; $j <= count($ime); $j++) {
if ($ocena[$i] < $ocena[$j]) {
$temp = $ime[$i];
            $ime[$i] = $ime[$j];
            $ime[$j] = $temp;

$temp = $ocena[$i];
            $ocena[$i] = $ocena[$j];
            $ocena[$j] = $temp;
}
}
}

I stvarno ne znam što si napravio toliku dramu od svega ovoga...

[Ovu poruku je menjao Nikola Poša dana 23.03.2009. u 17:18 GMT+1]



Ma nema drame. Ovaj KOD koji si ti napisao ima identicni pristup kao moj, samo ga malo ubrzavas sto u prvom poredjenju izbegavas da se niz $ime na istom indeksu ne uporedjuje sam sa sobom. Ali ok ovo jeste malo savrseniji KOD.
Kazes da je prosto resiti ovaj problem ali zar ne vidis da mnogi ovde govore da treba da se koristi neka funkcija da bi se doslo do resenja. Znas kako kazu "sve je prosto" kad se resi i kad se vidi resenje :)
[ Nemanja Avramović @ 23.03.2009. 19:37 ] @
Evo i mog rešenja, bez ikakvih petlji (sa sve benchmarkingom):

Code:
<?php
// benchmarking deo
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $starttime = $mtime;

// definisanje niza
$niz[1]['ime']='Ana';
$niz[1]['ocena']=6;

$niz[2]['ime']='Bilja';
$niz[2]['ocena']=8;

$niz[3]['ime']='Dejan';
$niz[3]['ocena']=7;

$niz[4]['ime']='Sasa';
$niz[4]['ocena']=5;

$niz[5]['ime']='Laza';
$niz[5]['ocena']=9;

$niz[6]['ime']='Maza';
$niz[6]['ocena']=10;

// funkcija za sortiranje
function sortiraj($a, $b) {
    if ($a['ocena'] == $b['ocena']) {
        return 0;
    }
    return ($a['ocena'] > $b['ocena']) ? -1 : 1;
}

// pozivamo uasort()
uasort($niz, 'sortiraj');

// ispis rezultata
echo '<pre>';
print_r($niz)

// bench. deo, prikaz vremena izvršenja skripte
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $endtime = $mtime;
   $totaltime = ($endtime - $starttime);
   echo "<p>Vreme izvrsenja skripte: ".$totaltime." sec</p>";
?>


Rezultati koje dobijam su:

Code:
Array
(
    [6] => Array
        (
            [ime] => Maza
            [ocena] => 10
        )

    [5] => Array
        (
            [ime] => Laza
            [ocena] => 9
        )

    [2] => Array
        (
            [ime] => Bilja
            [ocena] => 8
        )

    [3] => Array
        (
            [ime] => Dejan
            [ocena] => 7
        )

    [1] => Array
        (
            [ime] => Ana
            [ocena] => 6
        )

    [4] => Array
        (
            [ime] => Sasa
            [ocena] => 5
        )

)

Vreme izvrsenja skripte: 0.00017118453979492 sec


Mada mislim da bi trebalo da testiramo skriptu sa bar par stotina elemenata u nizu
[ Tudfa @ 23.03.2009. 19:40 ] @
Evo da se priključim diskusiji pošto sam se i ja interesovao ranije oko toga šta je brze i kako treba resiti nešto ovako.

@iizuzetan

Ako si na studijama, normalno da ćeš probleme rešavati pišući svoja rešenja jer se to od tebe tamo i trazi i tako ucis.

Ali ako nisi na studijama ili za projekat koji radis nije bitan bas svaki bajt i milisekunda,
iz svog iskustva bi ti toplo preporucio da ovo resis funkcijama iz array palete.

Evo i mog mišljenja zašto.

Prvo te funkcije su testirane, drugo uštedeće ti vreme, trece kod će ti biti manji a mozda i pregledniji, ...
Uostalom kao jedan od primera gde se koriste ove funkcije moze da se navede phpbb forum koji koristi
prakticno celu paletu array funkcija a vazi za jedan od najboljih open source foruma. Mislim to je ipak jedan ambiciozan projekat,
i tu je bas dosta polagano na optimizaciju koda radi povecanja brzine izvrsavanja i smanjenja zauzeca memorije.

Licno nisam neki pobornik da koristim gotov kod, ali isto tako nemam problem da koristim nesto za sta se vec zna da radi posao.

Valjda je bolje da ono sto vec postoji gotovo iskoristis,
a vreme koje bi utrosio na pisanje te svoje funkcije potrosis na pisanje onog sto nemas u gotovom obliku a treba ti.

poz
[ Nikola Poša @ 23.03.2009. 21:20 ] @
Citat:
Nemanja Avramović: Evo i mog rešenja, bez ikakvih petlji

Pa naravno da nema petlji kad imaš samo jedan niz...

@iizuzetan

Slažem se sa svim ovim što je Tudfa napisao, i naravno da treba koristiti ugrađene f-je, njih nije pisao bilo ko, već iskusni programeri, profesionalci, i one savršeno obavljaju svoj posao uz minimalno korišćenje resursa. Ali ovaj tvoj problem, za koji sam siguran da se nikad nećeš susresti s takvim nečim u realnim projektima , je bilo logičnije rešavati nekim svojim algoritmom, odnosno, praktično ga je bilo nemoguće rešiti sa nekom ugrađenom f-jom, a da prethodno ne spojiš ta dva niza u dvodimenzionalni, pa da onda ideš ovako kako je Nemanja napisao...
[ iizuzetan @ 23.03.2009. 21:27 ] @
Citat:
Nemanja Avramović: Evo i mog rešenja, bez ikakvih petlji (sa sve benchmarkingom):

Code:


.
.
.
.
Vreme izvrsenja skripte: 0.00017118453979492 sec


Mada mislim da bi trebalo da testiramo skriptu sa bar par stotina elemenata u nizu ;)



Moja skripta (usavrsena "Nikola Poša" dodatkom) se izvrsava u vremenu od 0.00010895729064941 sec a koristio sam potpuno iste funkcije za merenje vremena kao ti (iskopirao). E sad racunari nam nisu isti (tvoj je brzi), pa sam prekopirao ceo tvoj kod i izmerio vreme tvoje skripte i iznosi : 0.0001990795135498 sec

Znaci tvoje vreme na mom racunaru je 0.0001990795135498 sec a moje vreme na mom racunaru je 0.00010895729064941 sec.

Zakljucak: Moja skripta dolazi brze do resenja, i to cak brze za 45% !!!!!!!!!!!!
Drugim recima ako bi na indeksu bio veliki broj a tvoja skripta se izvrsi na primer za 10 sekundi moja bi se izvrsila za 5.5 sekundi. Malo li je?

E sad razlog je najverovatnije taj sto koristis dvodimenzionalni niz. Znaci jeste da je ugradjena funkcija brza od napisane skripte ali to ustedjeno vreme ti pojede dvodimenzionalan niz.

Napisao si da nemas ni jednu petlju. Jeste nemas vizuelno na prvi pogled ali nemoj da zaboravis da funkcija uasort() u sebi sadrzi potrebne petlje jer kako bi inace prosla kroz podatke i uporedila ih.
[ kazil @ 23.03.2009. 21:39 ] @
Benchmarking nizova se radi sa po nekoliko miliona elemenata, merenja se vrse vise puta i na kraju je merodavno srednje vreme.
[ Nikola Poša @ 23.03.2009. 22:07 ] @
@iizuzetan

Ok, super, i drago mi je što je taj moja mala izmena presudila što se tiče brzine :), ali u realnim projektima ćeš se verovatno pre susretati sa dvodimenzionalnim nizovima, i bolje je ići sa dvodimenzionalnim nego sa više jednodimenzionalnih. I takvi problemi se onda rešavaju upotrebom nekih od gotovih f-ja za rad sa nizovima. Jer npr. zašto bi ti sad pisao ceo taj algoritam za sortiranje, kad možeš da napišeš samo npr. sort($niz). Siguran sam da većina tih ugrađenih f-ja za sortiranje koristi neke od onih algoritama koje sam napisao na prethodnoj strani. Njih nisam izmislio ja, oni su provereni i poznati algoritimi, i već dugo se koriste u programiranju.

I što kaže Robert, za pravo testiranje, potrebno je mnogo više elemenata u nizu...
[ Aleksandar Ružičić @ 23.03.2009. 22:19 ] @
nisi naveo onaj koji vecina (ne mogu da tvrdim za sve, jer nisam gledao kod svih fja ali je verovatno da ga sve koriste) ugradjenih sort funkcija, a to je qsort (iliti quick-sort), on je malcice komplikovaniji od ovih koje si ti naveo ali je u najvecem broju slucajeva najbrzi.

@iizuzetan: ako stvarno hoces da vidis koji kod je brzi moras da testiras bar 3 puta sa nizovima od 1000 elemenata najmanje da bi dobio konkretne rezultate. kao sto je kazil i rekao.
[ Tudfa @ 23.03.2009. 23:16 ] @
Evo ga jedan test sa vise elemenata ,mislim da je sve ok, barem sve radi ok sto se Nemanjinog predloga tice.

uasort sa 2000 elemenata:

Code:

<?php
function sortiraj($a, $b) {
    if ($a['ocena'] === $b['ocena']) {
        return 0;
    }
    return ($a['ocena'] > $b['ocena']) ? -1 : 1;
}

//stvaranje velikog niza
$niz = array();
$n = 2000;
for($i = 1; $i<= $n;$i++)
{
    $niz[$i]['ime'] = 'ime'.$i;//ime + redni broj...
    $niz[$i]['ocena'] = ($i% 2 == 0 ? 5 : 10);
    //ako je redni broj paran ocena = 5 ako je neparan ocena = 10
       //ovo sam cisto radio ovako zbog sebe, da proverim da li se sa oba metoda dobijaju isti rezulati sto se tice sorta, tako da tu moze slobodno i rand(5,10)    
}

// benchmarking deo
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;

uasort($niz, 'sortiraj');

// bench. deo, prikaz vremena izvršenja skripte
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $endtime = $mtime;
   $totaltime = ($endtime - $starttime);
   echo "<p>Vreme izvrsenja skripte: ".$totaltime." sec</p>";
   
?>


Vreme izvrsenja skripte: 0.018789052963257 sec

resenje bez uasort:

Code:


<?php

//stvaranje velikog niza
$ime = array();
$ocena = array();
$n = 2000;
for($i = 1; $i<= $n;$i++)
{
    $ime[$i] = 'ime'.$i;
    $ocena[$i] = ($i% 2 == 0 ? 5 : 10);
}

// benchmarking deo
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;

//KLUCNA SKRIPTA KOJA SORTIRA NIZ $ime U ZAVISNOSTI OD VREDNOSTI NIZA $ocena:

for($a=1;$a<=$n; $a++){
    for($b=1;$b<=$n; $b++){
          if($ocena[$b]<$ocena[$a]) {
               $u=$ocena[$a];$t=$ime[$a];
               $ocena[$a]=$ocena[$b];$ime[$a]=$ime[$b];
               $ocena[$b]=$u;$ime[$b]=$t;
          } 
    }
}
/*
for($a=1;$a<=$n; $a++){
     echo '$ime['.$a.']->'.$ime[$a].'<br>';
}
*/

// bench. deo, prikaz vremena izvršenja skripte
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $endtime = $mtime;
   $totaltime = ($endtime - $starttime);
   echo "<p>Vreme izvrsenja skripte: ".$totaltime." sec</p>";
?>



Vreme izvrsenja skripte: 0.95595598220825 sec

E sad bi voleo da vi pregledate ovaj test, a narocito iizuzetan, jer ili sam ja nesto izostavio/zaboravi/prevideo ili je uasort pojeo ovo drugo resenje za dorucak.



[Ovu poruku je menjao Tudfa dana 24.03.2009. u 10:49 GMT+1]
[ rajkoBekrija @ 24.03.2009. 09:49 ] @
Citat:
javljaju vrlo slozena medjuresenja pa i u vidu jednodimenzionalnih nizova

Sta rece i osta ziv
[ rajkoBekrija @ 24.03.2009. 10:37 ] @
Samo da napomenem iz svog licnog iskustva, vec ako ti je toliko bitno, @iizuzetan, da dobijes brzi sort iz mase podataka mislim da neces nikako koristiti svoj algoritam (cini mi se skolski Bubble sort) .
Odnosno najbitnije nam je da na kraju mozemo dobiti sortirana imena nevezano za medjurezultate.

npr. n= 10k redova

tvoj algoritam

Code:
for($a=0;$a<$n; $a++){
    for($b=0;$b<$n; $b++){
          if($ocena[$b]<$ocena[$a]) {
               $u=$ocena[$a];
               $ocena[$a]=$ocena[$b];
               $ocena[$b]=$u;
          } 
    }
}

daje rezultat za 18.823191 sec,

Code:
arsort( $ocena );


daje rezultat za 0.003704 sec

----

za n=1M redova

tvoj algoritam daje rezultat za >2dana,

arsort algoritam daje rezultat za0.764639 sec,


[ dakipro @ 24.03.2009. 10:47 ] @
Ma najveca je fora sto niko nikad nece dovesti sebe u tu situaciju da tako sortira tolike nizove, nego uzmes lepo obradis, ubacis u bazu sta ti treba i kako je najlakse, i posle izvadis iz baze sa SORT BY zar par trenutaka, ionako je potrebna i paginacija uglavnom
Nego je dobro da teoretisemo malo, mada kad razmislim, meni je ovako nesto zatrebalo za ZIP locator, da se pretraze useri recimo koji su u krugu od 100milja od neke zip adrese, i da se sortiraju po daljini od pocetnog mesta pretrage, tu se mora raditi tako sa nizovima, naravno, lepo oblikovan multidimenzionalni niz sa dobrim pravim kljucevima i uz generic funkciju se ne oseti u radu...
[ rajkoBekrija @ 24.03.2009. 11:02 ] @
@dakipro

Sve zavisi na kakvom projektu radis, recimo projekat na 10 servera i svaki dan se parsiraju logovi koji budu teski i po 4GB na svakom serveru.

Znaci ima mnosto reporta koji se trebaju izvuci sa samo jednim prolazom kroz sve logove.