18.12.2010 | 16:54
@smayoo & djipi: zezancija sa C-om je to što se polja koriste kao i pointeri, te se prolasci kroz polja obavljaju pointerskom aritmetikom. To nije direktno problem dok se ne dođe do prenošenja polja u funkcije, što se isključivo radi pointerima. Slanjem polja (odnosno naziva polja) u funkciju prenosi se adresa na prvi element polja. Gdje je problem? Ne prenose se dimenzije polja, od tad nadalje se ne može trivijalno koristiti polja u 2D obliku [x][y] , već se sve prevodi u oblik x*MAX_STUPACA+y . Odnosno, moraju se, uz polje, poslati i dimenzije polja. Doduše, ovo je sve na osnovi početničkog programiranja, postoje metode kako to zaobići ali nisu za početnike. Ovaj problem će se ponovno pojaviti u odgovoru smayii
@smayoo Ako profesor očekuje rekurziju onda je naprosto blesav. Kao što sam već napisao, osim za pretraživanje stabala i pokuju čudnu upotrebu rekurzija je posve neupotrebljiva. Možemo lamentirati kako je rekurzija upotrebljiva na današnjim računalima, i možemo pričati o stacku koji je (virtualno) beskonačan, _ali_ to ne znači da je rekurzija nešto dobro. I dalje je loša jer je a) uvijek sporija b) uvijek troši više procesorskog i memorijskog prostora. Objašnjenje za determinantu (i zašto je profesor blesav) je jednostavno: pri svakom radu podmatricom originalne matrice moramo a) poslati trenutni redak i stupac i raditi sa ostatkom matrice ili b) kopirati podmatricu u novu matricu i s njom raditi.
Opcija a) će uzrokovati da ćemo u primjeru
a b c d
e f g h
i j k l
m n o p
morati poslati parametar 1,1 za a ; 2,1 za e itd .. također mora se
poslati veličina trenutne matrice kako bi sustav znao odrediti podmatricu.
Time se šalju 4 integera u svaki poziv. Poziva ima 4 za rang (3x3) i po 3 za svaku ranga 2x2. U rangu 2x2 možemo odmah izračunati, ne moramo (iako to možemo) pozvati funkciju. To je 4*3 = 12 poziva rekurzije, sa po 4 x 4 bytea (integer u VS-u je 4 bytea) = 16 byteova. Znači popapamo 192 bytea za 4x4. No pređimo na determinanu 20x20. Poziva funkciji ima 20! / 2! odnosno 2.43*10^18 / 2 = 1.22 *10^18 što uz 4*4 bytea znači da će kroz računalnu memoriju proći 19.6 * 10^18 byteova. Vjerujem kako ne moram objašnjavati detalje i implikacije tog računa. (napomena: 20! je 20 faktorijela, odnosno 20x19x18x17x16....x2x1)
b) je još gora opcija, jer će se trošiti vrijeme na kopiranje matrice u podmatricu, ali će se ovakav slučaj lakše distribuirati ako se radi o nekom clusteru. Umjesto slanja cijele matrice, šalje se dio koji se mora obraditi. Onda ove brojke gore ne izgledaju tako grozno.
Rekurzija je zato veliki no-no, i ako je tip očekivao riješenje sa rekurzijom onda je budala[1]!
@john_st z-training koristi standardni input i output, što se na linuxu lako izvede pipeanjem podataka. Uz nekakav filter da ne koriste "ključne" riječi koje bi mogle potrgati sustav može se izvesti sustav kakav je spomenuo djipi. No kako sam već napisao, KETTIS i DOMJudge sustavi koji se koriste na natjecanjima iz programiranja, koji rade upravo ono što tebi treba.
Što se JMBAG-a tiče, ako se zada nekakav algoritam koji računa neki red, uvijek se može ubaciti da rezultat treba podijeliti sa zadnje tri znamenke JMBAG-a, ili dati ostatak pri dijeljenju sa zadnje tri znamenke. Kolege na bazama su tako napravili bazu sa 1000 kupaca i za svakog kupca po nekoliko računa, i od studenata zatražili da im ispišu podatke za kupce sa ID-jem koji odgovara završetku JMBAG-a. Kolega koji je drilao sa Excelom je rekao da moraju za stupac G izvući sumu/srednju vrijednost/max itd. skupa brojeva koji su u rasponu od zadnje tri znamenke JMBAGa zapisane normalno i naopačke (npr 285 i 852). Ako radiš sa datotekama možeš uvesti istu foru, daš svima istu datoteku, ali ovisno o JMBAG-u moraju odraditi drugačiji raspon u datoteci.
[1] Zanimljivo, radim na fakultetu i kažem da je neki profesor budala. Apsolutno stojim iza toga da ima previše ljudi na fakultetima koji nazivno nešto znaju, a u realnosti ili nemaju pojma, ili imaju velikog pojma a to ne znaju prenijeti studentima. Na jabucnjaku piše moje puno ime i prezime, pa se slobodno možemo natezati kasnije o mojem mišljenju