Idi nazad   Croportal Forum > Tehnologija i Tehnika > Tutoriali i Trikovi
Registracija FAQ Lista korisnika Kalendar Pretraži Današnje Poruke Označi forume pročitanima Online igre


Tutoriali i Trikovi Raspravljate o temi Sortiranje u Tehnologija i Tehnika forumu; Sortiranje je jedna od elegantnijih stvari u Perlu jer je sam algoritam prepusten interpreteru dok mi mozemo jednostavno napisati, @arr = ...

Odgovor
 
Opcije Teme
Star 09-02-06, 01:51   #1 (permalink)
Administrator
 
Avatar od korisnika Kristijan
 
Datum registracije: 20-02-04
Lokacija: Hrvatska / Dubrava
Godina: 21
Poruka: 17,735
Kristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svima
Pošalji poruku preko ICQ-a korisniku Kristijan Pošalji poruku preko MSN-a korisniku Kristijan Pošalji poruku preko Skype-a korisniku Kristijan
Sortiranje

Sortiranje je jedna od elegantnijih stvari u Perlu jer je sam algoritam
prepusten interpreteru dok mi mozemo jednostavno napisati,
@arr = sort @arr;
i @arr polje ce biti sortirano abecednim redom[1]
Da upotpunimo sliku, slijedece sortiranje je po funkcionalnosti identicno
gornjem, uz dodatak izricito definirane funkcije za usporedjivanje,
@arr = sort {$a cmp $b} @arr;
Objasnjenje:
1) $a i $b su globalne varijable koje se koriste kod sortiranja i nije ih
potrebno definirati prije upotrebe.
2) {$a cmp $b} je funkcija koja zbog "cmp" operatora vraca -1,0, ili 1 s
obzirom na to da li je $a manji, jednak, ili veci u odnosu na $b.
3) sort funkcija vraca sortiranu listu s obzirom na rezultate prethodno
opisane funkcije
Ako provirimo ispod haube, sortiranje ce ovako izgledati,
HTML Kod:
my @arr = qw/ide prva kamila ide druga kamila/;
@arr = sort { #5)sortirano polje
my $rez = $a cmp $b; #2)usporedi rijeci
print "'$a' cmp '$b' == $rezn"; #3)koje rijeci usporedjujemo?
$rez; #4)moze i "return $rez"
} @arr; #1)nesortirano polje
print "@arr = @arrn"; #6)ispisi @arr
Dakle, pocetna tocka je nesortirano polje(1) ciji elementi se uz pomoc
anonimne funkcije usporedjuju(2), zatim se ispisuje sto se usporedjivalo(3),
i na kraju funkcije ostavljamo sam rezultat usporedbe(4).
-- rezultat --
HTML Kod:
'ide' cmp 'prva' == -1
'kamila' cmp 'ide' == 1
'druga' cmp 'kamila' == -1
'ide' cmp 'ide' == 0
'ide' cmp 'prva' == -1
'prva' cmp 'kamila' == 1
'ide' cmp 'druga' == 1
'ide' cmp 'kamila' == -1
'ide' cmp 'kamila' == -1
'kamila' cmp 'kamila' == 0
'kamila' cmp 'prva' == -1
@arr = druga ide ide kamila kamila prva
Osim sortiranja rijeci, moguce je sortirati i brojeve za sto se koristi <=>
ili tzv. "space ship" operator. Za njega vrijedi isto sto i za cmp, osim sto
s njim sortiramo iskljucivo brojeve,
@arr = sort {$a <=> $b} @arr;
[1] najvjerojatnije engleskim abecednim redom, za detalje pogledati "perldoc
perllocale"
Primjeri,
HTML Kod:
#abecedno sortiranje unatrag
@arr = reverse sort @arr;
#isto kao i gore (sporije)
@arr = sort {$b cmp $a} @arr;
#sortiranje bez obzira na mala/velika slova
@arr = sort {uc($a) cmp uc($b)} @arr;
#Schwartizan transform, napredno sortiranje
U nekim slucajevima imamo polja ciji elementi se moraju dodatno obraditi da
bi bili spremni za usporedjivanje. Takva obrada moze biti prilicno zahtjevna
i ako ne kesiramo rezultate obrade, efikasnost naseg sortiranja ce opadati s
brojem elemenata koje sortiramo.
Zbog toga bi bilo idealno da zahtjevnu obradu elementa obavimo jedanput, a
ne svaki put kad treba odluciti izmedju $a i $b.
Ovako bi izgledao prethodni primjer ako primjenimo kesiranje,
HTML Kod:
my @arr = qw/ide Prva kAmila/;
my @temp = map [ $_, uc ], @arr; #1
@temp = sort { $a->[1] cmp $b->[1] } @temp; #2
@arr = map $_->[0], @temp; #3
#1 kreiramo @temp polje koje napunimo tako da za svaki element iz @arr
nastane novi element koji je referenca na polje, pa je onda,
@temp = (
# nulti, prvi
['ide', 'IDE'],
['Prva', 'PRVA'],
['kAmila', 'KAMILA'],
)
#2 sortiramo _reference_ iz @temp tako da usporedjujemo _prve_ elemente
('IDE', 'PRVA', 'KAMILA').
#3 konacno napunimo @arr sa _nultim_ elementima iz sortiranog @temp ('ide',
'kAmila', 'Prva')
Schwartizan transform je sortiranje koje funkcionira na isti nacin samo sto
ne koristimo pomocno @temp polje nego ulancane funkcije, pa je to onda,
HTML Kod:
@arr = map $_->[0], #3
sort { $a->[1] cmp $b->[1] } #2
map [ $_, uc ], @arr; #1
Ako postoji potreba za dodatno ubrzanje, sortiranje se moze ubrzati
pakiranjem elemenata koji se usporedjuju,
http://www.sysarch.com/perl/sort_paper.html
Kristijan je offline  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Odgovori sa citatom
Star 06-05-06, 13:26   #2 (permalink)
Regularni forumas
 
Avatar od korisnika marshall
 
Datum registracije: 29-01-06
Poruka: 88
marshall se izdvaja iz mase
Re: Sortiranje

Odakle si ovo skidao?
marshall je offline  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Odgovori sa citatom
Star 07-05-06, 18:16   #3 (permalink)
Administrator
 
Avatar od korisnika Kristijan
 
Datum registracije: 20-02-04
Lokacija: Hrvatska / Dubrava
Godina: 21
Poruka: 17,735
Kristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svimaKristijan je poznat svima
Pošalji poruku preko ICQ-a korisniku Kristijan Pošalji poruku preko MSN-a korisniku Kristijan Pošalji poruku preko Skype-a korisniku Kristijan
Re: Sortiranje

nisam to od nikuda skidao, zašto?
Kristijan je offline  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Odgovori sa citatom
Odgovor
Tagovi: perl, sortiranje



Broj korisnika koji trenutno prate ovu Temu: 1 (0 članova i 1 gosta)
 
Opcije Teme

Pravila poruka
Vi smijete ne otvarati nove teme
Vi smijete ne odgovarati na poruke
Vi smijete ne slati privitke
Vi smijete ne urediti vašu poruku

vB Kod je Uključen
Smajlići Kod je Uključen
[IMG] kod je Uključen
HTML kod je Isključen
Trackbacks are Isključen
Pingbacks are Isključen
Refbacks are Isključen

Slične Diskusije
Tema Pokretač teme Forum Odgovora Zadnja poruka
Regexi Kristijan Tutoriali i Trikovi 0 09-02-06 01:40


Trenutno vrijeme na forumu: 10:56.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112