banjalukaforum.com
https://banjalukaforum.com/

C i Backtracking!!!
https://banjalukaforum.com/viewtopic.php?f=18&t=3467
Stranica 1 od 1

Autoru:  mdivljak [ 31 Dec 2002, 16:44 ]
Tema posta:  C i Backtracking!!!

Pretpostavljam da je pojam "Backtracking" poznat. Sledeci problem bi trebalo rjesiti, pri cemu se to moze rjesiti u programskom jeziku C ili Java. Problem izgleda ovako:

U jednom polju (Array), koji sadrzi npr. 20 int-Brojeva od min do max trebalo bi naci brojeve, cija suma iznosi X. Pri tome je moguce, da se u tom Array-u nalazi vise kombinacija brojeva, koji zajedno sumirani daju X kao rezultat. Zadatak bi bio, naci sve moguce kombinacije brojeva u tom Array-u, koji zajedno sumirani daju X. Pri tome smije jedan broj samo u jednoj kombinaciji biti koristen.

Na kraju bi trebalo pokazati sve kombinacije kao i rest, koji je jos ostao u Array-u, naravno kao kontrolu.

Dodatak:
Ako bi se ovaj zadatak rjesavao u Javi, mogao bi se koristiti Multi-Threading, pri cemu bi trazenje bilo mnogo brze, ako bismo npr. imali Array od 10000 int-Brojeva. Pri tome bi jedan broj iz Array-a tek onda bio udaljen, kad je jedna konkretna kombinacija nadjena. U bas ovdje je interesantno, jer bi se ovdje moralo sinhronizirati izmedju pojedinacnih Thred's.

O.K. Pa, do skorog "rjesenja".

Autoru:  dsimic [ 21 Jan 2003, 17:45 ]
Tema posta:  Put ka rjesenju

Rjesenje zasnovano na gruboj sili zasnivalo bi se na binarnom broju koji ima onoliko cifara koliko clanova ima niz, gdje 1 znaci da clan ulazi u sumu (a sabiras clanove pocevsi sa jedne "strane" binarnog broja sve dok ne prekoracis zadatu sumu i dok clanovi nisu "potroseni", da ne trosis vrijeme na bespotrebno sabiranje), a 0 da ne ulazi. Svaki put kada nadjes kombinaciju koja daje trazeni zbir, oznacis uzete clanove kao "potrosene". Lose rjesenje, po pitanju vremena izvrsavanja.

Rjesenje zasnovano na backtrack-u je slicno, opet podjes od toga da se prvi clan nalazi u sumi, pa probas sa drugim da se ne ulazi u sumu (druga mogucnost je da ulazi), saberes medjurezultat i ako je prekoracio vracas se unazad jedan korak u rekurziji, ako nije ides dublje u rekurziju, tj. prelazis na sljedeci element u nizu itd. Opet, obiljezavas clanove kao potrosene... Svaki put, kada ulazis u rekurzivni poziv, provjeris da li je element "potrosen", pa ako jeste, ne pravis kombinaciju koja element podrazumijeva kao "ukljucen". Ovo je vec bolje :wink:

A to sa threadovima... Kao prvo i C ima threadove, a moje je misljenje da nema smisla uvoditi threadove za ovaj zadatak na jednoprocesorskoj masini :angel: . A moglo bi se paralelizovati, dijeljenjem polaznih pozicija (tj. recimo polaznih pozicija na proizvoljnom nivou rekurzije, nakon odredjenog broja rekurzija izvrsenih od pocetka izvrsavanja) na nezavisne procese, pri cemu je sinhronizacija, naravno, potrebna ali nije problematicna, npr. koristenjem shared memory.

Ono sto mene interesuje jeste da li je ovo dijeljenje na kombinacije jednoznacno? Tj. da li je moguce naci vise setova disjunktnih skupova koji zadovoljavaju postavljene uslove?

Autoru:  mdivljak [ 07 Avg 2003, 22:06 ]
Tema posta: 

Tvoji predlozi zvuce dosta interesantno. Imao bih dva pitanja:
1. Zbog cega mislis, da "multithreading" na jednoprocesorskoj masini "ne donos nista"?
2. To sa "shared memory"? Kako bi to konkretno izgledalo?

Pozdrav

Autoru:  dsimic [ 08 Avg 2003, 08:02 ]
Tema posta:  C i backtrack

Ne, multithreading donosi svasta :wink: i na jednoprocesorskoj masini,
ali ja sam napisao da u ovom slucaju nista ne bi donio, posto je
krajnji cilj kod ovakvih problema postizanje sto boljeg vremena potrebnog
za izvrsavanje.

Shared memory kao koncept interprocess komunikacije bi se mogao
koristiti kao metoda / sredstvo za sinhronizaciju izmedju procesa nakon
izvrsene paralelizacije. Vidi npr.
http://www.google.com/search?hl=en&lr=& ... munication

Eto... :wink:

Stranica 1 od 1 Sva vremena su u UTC [ DST ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/