Kezdőoldal » Számítástechnika » Programozás » Milyen algoritmussal oldanád...

Milyen algoritmussal oldanád meg az alábbi feladatot?

Figyelt kérdés

Ü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



2022. jan. 7. 16:30
1 2 3
 11/25 anonim ***** válasza:
100%

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).

2022. jan. 10. 14:38
Hasznos számodra ez a válasz?
 12/25 anonim ***** válasza:
0%

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

2022. jan. 11. 13:24
Hasznos számodra ez a válasz?
 13/25 anonim ***** válasza:
100%

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.

2022. jan. 11. 13:31
Hasznos számodra ez a válasz?
 14/25 anonim ***** válasza:
0%
Csak a python interpreterébe irkáltam és futtattam, külön fájlba nem is mentettem ki a szkirptet, de most megtettem : [link]
2022. jan. 11. 15:52
Hasznos számodra ez a válasz?
 15/25 anonim ***** válasza:
100%

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.

2022. jan. 11. 18:44
Hasznos számodra ez a válasz?
 16/25 anonim ***** válasza:
0%

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?

2022. jan. 11. 19:50
Hasznos számodra ez a válasz?
 17/25 anonim ***** válasza:
100%

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.

2022. jan. 11. 19:57
Hasznos számodra ez a válasz?
 18/25 anonim ***** válasza:
#16 könnyebb feladatokat gyakorolj, ha kezdő vagy még, ez már meghaladja a középiskolás szintet.
2022. jan. 11. 20:06
Hasznos számodra ez a válasz?
 19/25 anonim ***** válasza:
0%

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.

2022. jan. 11. 20:23
Hasznos számodra ez a válasz?
 20/25 anonim ***** válasza:
67%

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.

2022. jan. 11. 21:22
Hasznos számodra ez a válasz?
1 2 3

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!