Editorial for Izgubljeni niz
Submitting an official solution before solving the problem yourself is a bannable offence.
Analiza
Pre početka ključno je uvideti da pošto za svako važi , a kako niz između ostalih sadrži i rezultate operacije ili primenjene nad istim članom izvornog niza, zaključuje se da je traženi niz zapravo podskup zadatog niza. Nameće se naivno rešenje da se formiraju svi podskupovi niza koji sadrže tačno članova, a zatim ispita koji tačno od njih daje zadati niz , međutim, ovo rešenje pati od izuzetno visoke vremenske složenosti.
Nije teško dalje zaključiti da rezultat ili operacije nad bitovima dva prirodna broja (operandi) nikada nije manji, već isključivo broj veći ili jednak većem operandu. Iz prethodnog lako se izvodi da su dva po vrednosti najmanja člana datog niza , označimo ih sa i , sigurno i članovi izvornog niza , odnosno i . Sledeći član izvornog niza biće ili treći po vrednosti član niza , to jest , ili pak četvrti, , ukoliko je . Ponavljanjem ovog postupka, može se doći do svih članova izvornog niza, na mnogo efikasniji način od prethodno pomenutog.
Naime, u svakom koraku algoritma iz niza treba eliminisati ili na neki način označiti sve članove koje je moguće formirati pomoću članova niza koji su već određeni, a zatim u niz dodati prvi sledeći po vrednosti član zadatog niza.
Smernice za algoritam
Po učitavanju članova niza najpre je zadati niz neophodno sortirati u neopadajućem redosledu koristeći se nekim efikasnim algoritmom. Pošto niz ne sadrži jedinstvene vrednosti, već se jedna vrednost može ponavljati više puta, u jednom prolasku kroz dobijeni sortiran niz označiti indekse kada se svaka vrednost pojavljuje prvi put. Zatim, u glavnoj petlji, prolaziti kroz sortiran zadati niz i dodavati članove u niz , ali samo pod uslovom da taj član već nije moguće dobiti nekom kombinacijom članova koji su već dodati u niz . Da bi se ovo izvelo na efikasan način, prilikom svakog novog dodavanja u niz proveriti i označiti sve indekse članova niza koje je moguće formirati uparivanjem poslednje dodatog člana sa svim prethodnim koji se već nalaze u nizu . Drugim rečima moguće je koristeći se već označenim indeksima pojedinih vrednosti i njihovim inkrementiranjem znati do kog indeksa niza je izvodljivo generisati sve članove, a zatim dodati prvi sledeći kada se do njega dođe. Ovaj proces nastaviti dok se ne prođe kroz čitav zadati niz. Kako niz sadrži članova, glavna petlja ima zapravo kvadratnu složenost, odnosno . Međutim, kako je zadati niz prethodno sortiran, to će ova operacija dominirati, te je zapravo ukupna vremenska složenost ovog algoritma.
Comments