Milyen algoritmussal oldanád meg az alábbi feladatot?
Üdv. Ez egy (újabb) olyan feladat vagy kihívás, ahol a lényeg, hogy a programnak a lehető leggyorsabban kell lefutnia.
Programnyelvet tekintve tetszőleges, de célszerű a sebesség miatt a C/C++ nyelvek használata.
Továbbra is igaz, hogy nem kódot kérek, hanem a kérdés, milyen algoritmussal, adatszerkezettel oldanád meg ezt a feladatot.
---------------
A feladat:
Egy számsorozatban csupa különböző egész szám van.
Írj programot, amely megadja az egymástól legmesszebb levő két elemet, amelyek közül az első
nagyobb, mint a második (azaz rendezés után ellenkező sorrendben lennének)!
Bemenet
A standard bemenet első sorában az elemek száma van (1 ≤ N ≤ 500 000).
A következő sorban az N különböző pozitív egész szám található (értékük legfeljebb 10 millió).
Kimenet
A standard kimenet első sorába a két legmesszebb levő elemnek az értékét kell írni, amelyek közül az első nagyobb, mint a második! A második sorba ezen két elemnek a távolságát. Több megoldás esetén bármelyik kiírható.
Rendezett sorozat esetén egyetlen -1-et kell kiírni!
Példa 1:
Bemenet
10
7 2 4 17 6 5 13 10 18 19
Kimenet
7 5
5
Példa 2:
Bemenet
10
4 10 17 15 14 28 9 25 9 11
Kimenet
10 9
7
Korlátok:
Időkorlát: O(n) vagy O(n logn)
O(N^2) megoldás nem fogadható el.
Memórialimit: 32 MB
Maradjunk ennel a peldanal:
7 2 4 17 6 5 13 10 18 19
Megvan hozza a suffix min tombunk, O(n) komplexitassal:
sMin = [2, 2, 4, 5, 5, 5, 10, 10, 18, 19]
Ez ugye megmutatja, hogy adott indexen mi a legkisebb elerheto ertek a suffixban.
Mi van ha meg tudnank mondani, hogy adott indexen mi a legnagyobb elerheto ertek a prefixben?
Generaljuk le a suffix min mellett a prefix maxot is, szinten O(n) komplexitassal:
pMax = [7, 7, 7, 17, 17, 17, 17, 17, 18, 19]
A bemeneti tombot el is felejthetjuk.
Mi a celunk? Megtalalni azt az i es j indexpart, ahol pMax[i] > sMin[j] es j - i a legnagyobb.
Mivel mindket tombunk rendezett, ezt szinten megtehetjuk O(n) komplexitassal. Elindulunk a 0 indexrol, ha pMax[i] > sMin[j] akkor ++j, egyebkent ++i, ameddig el nem erjuk valamelyik tomb veget (tovabb nyilvan nem erdemes vizsgalni, hiszen ha pMax vegen vagyunk, akkor j - i maximum 0 lehet, ha sMin vegen, akkor pedig nem letezik jobb megoldas az eddig megtalaltnal, mert j - i mar csak csokkenhet).
A példánál maradva az O(N*log(N)) és az O(N) megoldás be és kimenete:
Be : 7 2 4 17 6 5 13 10 18 1
Ki :
7 5
5
----
2 13
5
Meg van még ahol jó megoldást ad az O(N), de pl ennél nem:
szintén mind a két módszer szerint:
Be:
2 6 4 8 1 5 7 10 3 9
Ki:
6 3
7
----
6 9
8
A két generált segédtömb:
s min = 1, 1, 1, 1, 1, 3, 3, 3, 3, 9
p max = 2, 6, 6, 8, 8, 8, 8, 10, 10, 10
Ezek szerint nem jol implementaltad.
En megirtam most gyorsan az O(N)-t C++-ban.
[7, 2, 4, 17, 6, 5, 13, 10, 18, 1]:
7, 1
9
[2, 6, 4, 8, 1, 5, 7, 10, 3, 9]
6, 3
7
Ha megosztod a kododat megmondom, hol a hiba.
Mobilról vagyok, de így ránézésre te a tényleges indexekkel számolsz. Ha van mondjuk a prefix tömbben 4db 1-es egymás mellett, az nyilván ugyanahhoz az indexhez tartozik a bemeneti tömbben. Érdemes letárolni az értékek mellett az indexeket is.
De ha ilyen szintű nehézséget okoz neked ez a feladat, akkor inkább könnyebbekkel kellene foglalkoznod először.
Persze hogy az indexekkel számolok, hiszen hogy máshogy tudnám a távolságot mint az indexeik alapján. Egyébként te írtad : "A bemeneti tombot el is felejthetjuk."
"Mi a celunk? Megtalalni azt az i es j indexpart, ahol pMax[i] > sMin[j] es j - i a legnagyobb.
Mivel mindket tombunk rendezett, ezt szinten megtehetjuk O(n) komplexitassal. Elindulunk a 0 indexrol, ha pMax[i] > sMin[j] akkor ++j, egyebkent ++i, ameddig el nem erjuk valamelyik tomb veget (tovabb nyilvan nem erdemes vizsgalni, hiszen ha pMax vegen vagyunk, akkor j - i maximum 0 lehet, ha sMin vegen, akkor pedig nem letezik jobb megoldas az eddig megtalaltnal, mert j - i mar csak csokkenhet)."
Ebben mit nem csináltam úgy mint a specifikáció amit írtál?
Nem specifikációt írtam, hanem az ötletet, amiből ki tudsz indulni.
De ha ennyi segítséggel sem tudod megoldani, akkor felejtsd el ezt a feladatot, nem neked való még. Az alapokat tanuld.
A könnyebb feladatok nem kihívások, egyébként jó megoldást ad az O(N*log(N))-es megoldás ezen esetekre (is), amit ide bemásoltam mint kimentet hibásan másoltam be, de ha bárki is vette volna a fáradságot amit az ideone-ra feltöltöttem akkor rájöhetett volna. A hibát a fáradság és a python interpreterbe valami elgépelés okozhatta a hibát. Mint említettem múltkor is : "Csak a python interpreterébe irkáltam és futtattam, külön fájlba nem is mentettem ki a szkirptet,".
Konkrétan az O(N)-es megoldásra senki nem tudta megírni eddig hogy konkrétan azért nem jó mert ... . Konkrétan rámutatásra gondoltam, hogy ebben tér el a specifikációtól.
A konnyebb feladatok nem kihivasok, errol meg fingod nincs ennyi segitseggel, pedig mar annyibol rajohettel volna a megoldasra, hogy prefix maxot es suffix mint hasznalok.
Ahelyett, hogy itt pattogsz, inkabb debuggold a megoldasodat, en nem fogom helyetted.
Mar [6, 4]-re is rossz megoldast ad, egy 2 elemu tombnel talan kepes vagy rajonni, hogy mi lehet a problema.
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!