Kezdőoldal » Számítástechnika » Programozás » Van jobb megoldás erre a...

Van jobb megoldás erre a feladatra?

Figyelt kérdés

A feladat a következő:

- a bemeneti érték egy tömb

- a kimeneti érték szintén egy tömb, ahol adott index értéke annyi, amennyi darab kisebb szám található a bemeneti tömbben az azonos indexen álló számnál


Példa:

- bemenet: [8, 3, 1, 5]

- kimenet: [3, 1, 0, 2]

Tehát 8-3, mert 8-nál 3db kisebb szám van a bemeneti tömbben (1, 3 és 5)

3-1, mert 3-nál 1db kisebb szám van a bemeneti tömbben (az 1)

1-0, mert az 1 a legkisebb szám a bemeneti tömbben

5-2, mert 5-nél 2db kisebb szám van a bemeneti tömbben (1 és 3)


A megoldásom a következő:

- létrehozom a kimeneti tömböt (a mérete megegyezik a bemeneti tömb méretével)

- for ciklussal végig iterálok a bemeneti tömbön

- a fenti for ciklusban újabb for ciklust indítok, ami szintén végig iterál a tömbön

- ha a belső for ciklus aktuális eleme kisebb, mint a külsőé, akkor a kimeneti tömb megfelelő indexén lévő értéket inkrementálom

- visszaadom a kimeneti tömböt


Ez elég triviális megoldásnak tűnik és nem vagyok biztos benne, hogy nem-e létezik ennél jobb megoldás.


Nem szükséges kódot írni, csak ötletekre lennék kíváncsi inkább.



2020. márc. 13. 12:30
1 2
 1/12 A kérdező kommentje:
Először rendezésre gondoltam, de aztán rájöttem, hogy akkor meg nem tudom majd a számok eredeti helyét.
2020. márc. 13. 12:41
 2/12 A kérdező kommentje:
Azt elfelejtettem leírni, hogy a számok 0-100 intervallumban fordulhatnak elő, a tömb mérete viszont egészen nagy is lehet, akár több ezer elemű.
2020. márc. 13. 12:44
 3/12 anonim ***** válasza:

Rendezetlen tömbre szerintem ez egy egész jó algoritmus. Az aktuális elem mondjuk önmagát is ellenőrzi, tehát pl. a külső ciklusban a 3-at a belső ciklusban ezzel a hármassal is összehasonlítja, de lehet, hogy még így is kisebb erőforrásigényű, mint a belsőben átugornia az aktuális elemet.

Nagy tömbök esetén esetleg létre lehet hozni valami átmeneti adatstruktúrát, ahol azt jelzed, hogy ha egy elem kisebb, mint az aktuális, akkor azt már erre vonatkozóan legközelebb ugorja át, tehát visszafelé ne ellenőrizze. De ez csak akkor éri meg (talán), ha tényleg nagyon nagy tömbről van szó.

2020. márc. 13. 12:53
Hasznos számodra ez a válasz?
 4/12 anonim ***** válasza:
62%

Az algoritmusod négyzetes komplexitást eredményez és belátható, hogy performancia szempontjából ez elég rossz.

Lineáris komplexitással is megoldható a dolog, én valahogy így csinálnám:


https://pastebin pont com/4gZtm5E1

(könnyen elképzelhető, hogy van jobb megoldás, nem agyaltam rajta sokat)


Összehasonlításképpen te 100 elemű tömbnél 10 000 elemet érintesz, 1 000 eleműnél már egy milliót és így tovább.

Ez a lineáris megoldás 100 elem esetén 200 elemet érint (+ konstans 101), 1 000 elem esetén 2 000-et (+ konstans 101) stb.


A space complexity ugye attól függ, hogy módosítható-e a bemeneti tömb. Mivel erről nem írtál semmit, így feltételeztem, hogy igen és így konstans a komplexitás. Ha nem módosítható a bemenet, akkor nyilván új tömbbe kéne írni az eredményt (ami lineáris komplexitáshoz vezetne).

2020. márc. 13. 14:31
Hasznos számodra ez a válasz?
 5/12 anonim ***** válasza:
100%

Szerintem így gyorsabb nagyméretű bemenet esetén:

- létrehozod a kimeneti tömböt

- létrehozol egy 101 elemű int tömböt (0-100 lehet az érték), 0-kkal inicializálod

- bejárod a bemeneti tömböt és a számláló tömbben növeled az "bemenet[i]" indexű számlálókat

- még egyszer bejárod a bemeneti tömböt és minden iterációban összeadod az "bemenet[i]"-nél kisebb indexű elemeket a számláló tömbből; és ezt beteszed a kimeneti tömbbe


Ez O(n)-es, ha jól gondolom (a legrosszabb eset: n + n * 100 // a csupa 100 esete). A tiéd pedig O(n^2)-es.

2020. márc. 13. 14:31
Hasznos számodra ez a válasz?
 6/12 anonim ***** válasza:
100%
#4 még jobb, mint az enyém, jó ötlet!
2020. márc. 13. 14:34
Hasznos számodra ez a válasz?
 7/12 A kérdező kommentje:
Köszönöm, ilyen megoldások soha nem jutottak volna eszembe szerintem :)
2020. márc. 13. 14:55
 8/12 A kérdező kommentje:
Bevallom a 4-es megoldást nem teljesen értem, kaphatok hozzá magyarázatot?
2020. márc. 13. 15:12
 9/12 anonim ***** válasza:
76%

Hasonló a logika, mint amit #5 írt, csak feltöltöm a számláló tömb üres indexeit a megelőző értékkel, ezzel megspórolva a későbbi iterációkat a számláló tömbön.

Tehát ha a bemenet mondjuk [1, 1, 5], akkor így fog kinézni a számláló tömb: [0, 2, 2, 2, 2, 7]

[1, 1, 5, 3] bemenet esetén: [0, 2, 2, 3, 3, 8]

Ezután a bemenet i indexéhez csak ki kell vennem a számláló tömb i - 1 indexét, mert az a megelőző elemek számával egyenlő.

2020. márc. 13. 15:28
Hasznos számodra ez a válasz?
 10/12 anonim ***** válasza:
100%
Bocs, rosszul írtam, [0, 2, 2, 2, 2, 3] és [0, 2, 2, 3, 3, 4] nyilván, hiszen 5-ből csak 1db van, nem 5.
2020. márc. 13. 15:35
Hasznos számodra ez a válasz?
1 2

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!