Mi a legjobb futásidő és memória komplexitás ami elérhető ennél a Java feladatnál?
Van egy n elemű int tömb amiben 1-től n-ig fordulhatnak elő elemek. Lehet olyan ami többször és olyan ami egyszer sem. Vissza kell adni hogy hány elem nincs a tömbben.
Pl {4 1 1 3} tömbnél 1 az eredmény mert a 2 hiányzik.
{3 1 3 3 1}-nél 3 az eredmény, mert a 2 4 és 5 hiányoznak.
Azt gondoltam hogy legenerálom a számokat 1-től n-ig egy Setbe, végig megyek a tömbön és ha az aktuális elem nincs a Setben akkor növelem az eredményt eggyel.
Ez így asszem O(n) idő és O(n) memória. lehet valamelyiket tovább csökkenteni?
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
"Ez így asszem O(n) idő és O(n) memória. lehet valamelyiket tovább csökkenteni?"
A space-t lehet konstansra.
Tehát akkor O(n) idő és O(1) memória a legjobb megoldás.
Rendben, köszi!
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
Mivel 1-től n-ig fordulnak elő a számok, így minden szám megfeleltethető a tömb egy indexének.
Végig mégsz a tömbön és az előforduló számoknak megfelelő indexeket megjelölöd, aztán végig mész mégegyszer és ha egy index nincs megjelölve, akkor növeled eggyel az eredményt.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
És hogyan jelölöd meg az indexeket, ha nem hozhatsz létre egy másik tömböt?
És hogyan számolod meg őket egy bejáráson belül? Amíg a megjelöléssel nem értél a végére, nem tudhatjuk, melyik indexnél kell eggyel növelni az eredményt.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
"És hogyan jelölöd meg az indexeket, ha nem hozhatsz létre egy másik tömböt?"
Negatívra állítom az értéküket.
"És hogyan számolod meg őket egy bejáráson belül? Amíg a megjelöléssel nem értél a végére, nem tudhatjuk, melyik indexnél kell eggyel növelni az eredményt."
Az egy bejárásos megoldásnál nem a megjelölteket számolnám.
Tudom, hogy N szám van összesen, tehát ha megjelölök egyet, akkor már csak N - 1 hiányozhat. Ha megjelölök mégegyet, akkor már csak N - 2 és így tovább. Ha a tömb végére érve megjelöltem M indexet, akkor N - M a megoldás.
Két körös megoldás olyan szempontból jobb, hogy ott vissza lehet állítani a tömb eredeti állapotát (ha szükséges, a kérdésben nincs erre vonatkozó megkötés), egy körös megoldásnál nem.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
Vagyis ha mondjuk n=25 és az első tag 24, akkor a 24-es indexű tagot átállítod pl. -1-re, jól értem? Hogyan fogod akkor figyelembevenni azt, amelyik eredetileg a 24-en volt?
De még ha működne is elfogadhatatlan egy ilyen függvénytől, hogy megsemmisíti a tömböt. Miért akarnánk tudni egy tömbről, hogy hány különböző eleme van, ha nem akarunk vele tovább dolgozni? Íratlan szabály, hogy ha a feladat célszerűsége nem foglalja magában, vagy nincs külön megengedve, akkor nem módosítjuk a kapott adatszerkezeteket.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
Úgy érzem, mintha egy óvodásnak magyaráznám a differenciálszámítást.
Mi a fenéért állítanám a 24-et -1-re? Ha 24 egy érték, akkor -24, re állítom. Így bármikor visszakaphatom az eredeti értéket.
Azt is külön kiemeltem, hogy a 2 körös megoldásnál visszaállítható az eredeti tömb, 1 körben nem (bár utána ott is bármikor, egy újabb körben).
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!