Kezdőoldal » Számítástechnika » Programozás » Elakadtam egy HackerRanks...

Elakadtam egy HackerRanks feladatban, hol lehet a hibám? (bármely C szerű nyelvben)

Figyelt kérdés

HackerRanks, Picking numbers feladat. Nem konkrét interjúra vagy ilyesmire kell és nem iskolai feladat, az oldal email-ben küldte.


Given an array of integers, find and print the maximum number of integers you can select from the array such that the absolute difference between any two of the chosen integers is less than or equal to 1.


....


Sample Input 0


6 a hossza

4 6 5 3 3 1 a számok, nem feltétlenül rendezett, mint a mellékelt ábra is mutatja


Sample Output 0


3



https://pastebin (pont) com/ZAHk1W0F


Hol a hibám?

Ez C#, de nem muszáj ahhoz ragaszkodni, bármely C nyelvben megérteném a lényeget. :)


2020. jan. 28. 15:13
1 2 3 4
 21/37 anonim ***** válasza:
0%

Nem én voltam a 7-es válaszoló, de megvédeném. Valószínűleg akkor még nem olvasta azt a kommentet, hogy az értékkészlet 1 és 99 közé esik. (12 perccel az ő kommentje előtt volt, akár lehet, hogy addig írta a válaszát mert pl valami közbejött neki)


Nyilván 2-100 darab számra ami 1-99 közé esik konstans időben megoldható a feladat:)


Úgy írjatok O(n)-es megoldást, hogy a számok méretére nincs kitétel (vagy mondjuk maximum 1024 bites számok, erre a jelenlegi gépeken nem tudtok elég memóriát foglalni).

2020. jan. 28. 18:20
Hasznos számodra ez a válasz?
 22/37 anonim ***** válasza:
0%
Illetve pontosítanám, olyan algoritmust írjatok ami konstant méretű memóriát használ, mert pl hashsetekkel lehet még ügyeskedni.
2020. jan. 28. 18:23
Hasznos számodra ez a válasz?
 23/37 anonim ***** válasza:
28%

#22 senki nem mondta, hogy O(1) space-ben megoldható a feladat.

O(n)-ben pedig simán megoldható a számok értékhatárától függetlenül (egy bizonyos értékhatár felett már nyilván HashMap-et használva).

2020. jan. 28. 18:26
Hasznos számodra ez a válasz?
 24/37 anonim ***** válasza:
77%
Pontosabban megolható O(1) space-ben nyilván, csak úgy nem, hogy mellette O(n) a time.
2020. jan. 28. 18:27
Hasznos számodra ez a válasz?
 25/37 anonim ***** válasza:
20%

#21, #22 te a fogalmakkal sem vagy tisztában, úgy tűnik.


"Nyilván 2-100 darab számra ami 1-99 közé esik konstans időben megoldható a feladat:)"


Igen? Oldd már meg akkor konstans időben, tehát O(1)-ben.

És aztán publikálhatod is egyből, mert senki más nem tudja a világon rajtad kívül :)

2020. jan. 28. 18:31
Hasznos számodra ez a válasz?
 26/37 anonim ***** válasza:
63%

"Úgy írjatok O(n)-es megoldást, hogy a számok méretére nincs kitétel (vagy mondjuk maximum 1024 bites számok, erre a jelenlegi gépeken nem tudtok elég memóriát foglalni)."


Ezzel az a gáz, hogy adott függvénynek, a változók számosságától függően, akár több Ordója is lehet, de ilyenkor is a legkisebbet kell venni.


A hetes viszont expressis verbis kizárta O(n)-t.

2020. jan. 28. 18:50
Hasznos számodra ez a válasz?
 27/37 anonim ***** válasza:
0%
A HashMap-ekkel az a baj, hogy ha direkt úgy válogatják ki a számokat (nyilván nem az 1-99-es intervallumbelieket, hanem bármilyen "elég nagyot"), hogy sok ütközés legyen, akkor nem fog lineáris időben lefutni. Erre csak az exponenciális (értékkészlet méretének) méretű tárhely lenne a megoldás.
2020. jan. 28. 20:53
Hasznos számodra ez a válasz?
 28/37 anonim ***** válasza:
24%

"Igen? Oldd már meg akkor konstans időben, tehát O(1)-ben."


A megadott feltételekkel (kevesebb mint) 100^200 bemenet lehetséges. (azért 100, mert ha pl 3 számot vizsgálunk, vehetjük úgy, hogy 8,3,5,0,0,0,0....)

Fogsz egy 100^200 méretű memóriát (oké, ez nagy, de korlátos és nem függ a bemenettől) és feltöltöd az előre kiszámolt értékekkel a következő képen:

A bemenetből (tomb) generálsz egy indexet:

index = 0;

ciklus i = 1-200:

ha tomb hossza >= i

index = index + tomb[i]

index = idnex * 256; // vagy 100, ahogy tetszik...

ciklus vége


Ez a ciklus konstans 200 lépés, nem függ a bemenet hosszától...


A memóriádnak az adott elemén az ennek megfelelő "válasznak" kell lennie előre kiszámolva. (Monduk beégetve a kódban)


Majd az algoritmusod csak kiszámolja ezt az indexet (konstans futásidő...) és megnézi mi van ott a memóriában..


Oké, lehet sokkal hatékonyabban is, de nem ezt a kérdés.


Nem kell zseninek lenni ahhoz hogy belásd hogy korlátos bemenet esetén az adott korlátnak megfelelő időn belül lefutó algoritmust lehet írni.


Nyilván írhattam volna a ciklust a bement hosszáig, de nem akartam hogy megzavarjon, még azt hinnéd, hogy függ a bemenet hosszától a futásidő.

2020. jan. 28. 21:13
Hasznos számodra ez a válasz?
 29/37 anonim ***** válasza:
100%

"A HashMap-ekkel az a baj, hogy ha direkt úgy válogatják ki a számokat (nyilván nem az 1-99-es intervallumbelieket, hanem bármilyen "elég nagyot"), hogy sok ütközés legyen, akkor nem fog lineáris időben lefutni. Erre csak az exponenciális (értékkészlet méretének) méretű tárhely lenne a megoldás."



Semmi baj nincs a HashMap-ekkel.

Ha mondjuk 32 bites integer hasheket használunk (nyilván ez nyelvtől is függ) és ennél nagyobb az értékkészlet, akkor egyszerűen csak több HashMap-et használunk.

Adott érték megfelelő HashMap-hez rendelése nyilván O(1) művelet, tehát a komplexitást abszolút nem befolyásolja.

2020. jan. 28. 21:17
Hasznos számodra ez a válasz?
 30/37 anonim ***** válasza:
100%

#28 írj már egy példát, mert elképesztő baromságnak tűnik, amit írtál, de lehet csak én értem félre.

(Mármint konkrét példát arra, hogy az általad leírt logikával megoldod a feladatot)

2020. jan. 28. 21:25
Hasznos számodra ez a válasz?
1 2 3 4

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, 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!