[Konkurens] konkurens első beadandó

Grünwald Péter grunci at gmail.com
Sun Oct 10 18:40:46 CEST 2021


 Szia!
Szerintem jó feladat, megfelelően bonyolult ahhoz, hogy beadandónak
lehessen nevezni.
Bár van egy olyan érzésem, hogy elég sok 5 pontos beadandóval fogok
találkozni :)

Üdv,
Grünci

On Sun, Oct 10, 2021 at 1:46 PM Menczer Andor <menczer.andor at gmail.com>
wrote:

> Sziasztok,
>
> Első beadról már kérdezgetnek a hallgatók, úgy tűnik hogy őszi szünet
> elejére szeretnék ha meglenne.
>
> Már régebben írtam, de megint írom hogy régen megcsináltam párhuzamosan a
> merge sort-t, tehát fejben megvannak az optimalizálási lépések. Maga az
> alap feladat elég egyszerű, tehát akinek nem megy nagyon a tárgy is el
> tudna kezdeni dolgozni, aztán amikor jönnek az extra feladatok extra
> pontokért, addigra meg már belejönnek.
>
> Nagyon nagy vonalakban erről lenne szó:
>
>    - Van az Arrays.sort(), ez gyors, de csak 1 szálat használ, ennél kéne
>    gyorsabbat írni több szál használatával. Alapfeladat, pl 5 pontért (a
>    15-ből) lehetne annyi hogy megírják a merge sort összefésülő metódusát,
>    illetve egy feldarabolós metódust ami egy n hosszú listából k db n/k hosszú
>    listát csinál. Eddig csak Java alaptudás kellett. Eddigi órai feladatok
>    alapján pedig tudniuk kell olyat csinálni, hogy a k listát rendezik k
>    szálon az Arrays.sort() segítségével, majd a main-ben join()-nal bevárják,
>    és az összefésülő metódussal egyberakják a sok, külön külön már rendezett
>    listát. Ez baromi lassú lesz, de kezdésnek jó.
>    - Felesleges memóriafoglalásokat és másolásokat ki lehet hagyni ha nem
>    daraboljuk fel az eredeti listát k kisebb listára, csak az indexekkel
>    bűvészkedünk. Tehát legyen a program elején két n hosszú tömbünk és a
>    program futása során csak ezeket használjuk. Az első tömb maga a rendezendő
>    szám-sorozat, míg a második egy kinullázott n hosszú tömb. A rendezésnél az
>    i. szál a tömb1 i. szeletét rendezve átmásolja a tömb2 i. szeletébe. Ha ez
>    megvan akkor a main log2(n)-szer ide-oda másolja a két tömb között az
>    adatokat, az összefésülések miatt mindig duplájára nőnek a rendezett
>    szeletek méretei.
>    - Az algoritmus 2. lépése, az összefésülés is párhuzamosítható, ehhez
>    írjuk át az algoritmust úgy hogy ne a main indítson el k szálat, hanem oszd
>    meg és uralkodj alapon legyen rekurzív: minden szál, beleértve a main-t is,
>    max 1 "testvérszálat" hozzon létre ami a tömb egyik felét rendezi, míg mi
>    rendezzük a másik felét. Egy rendezésnél mindig átkerülnek az adatok a 2
>    tömb közül a másikba, viszont mivel a testvér és mi is egy rendezést /
>    másolást végzünk, ezért amikor kész van a szál és join-nal bevárja a
>    testvért, akkor ugyanabban a tömbben lesznek az adatok. A testvér és a
>    saját munkánkat fésüljük össze az eredeti tömbbe. így az adatok már
>    rendezve lesznek és az eredeti tömbben is maradnak. Ha ezt az osztd meg és
>    uralkodj algoritmust rekurzívan használjuk akkor tetszőleges 2 hatvány
>    levéllel rendelkező bináris fát fogunk kapni. Kérjük le javaban hogy hány
>    szálat támogat a gép és a legkisebb legalább ekkora kettő hatvánnyal
>    rendelkező fával futassuk az algoritmust. Ekkor a fa egyes szintjein
>    párhuzamosan fog történni az összefésülés is, maga a main egyetlen
>    összefésülést fog végezni, míg ezen optimalizáió nélkül log2(n)
>    összefésülést kéne csinálnia
>
> Ez csak piszkozat, a hallgatóknak kicsit szebben, szájbarágósabban írnám
> le, de kb ez lenne a feladat. Lehet kissé száraz, nem olyan menő vagy
> jópofa mint pl a warcraft-os, de annyi előnye talán azért van ennek is hogy
> itt lehet sebességet is mérni. Azért az egyfajta sikerélmény a hallgatónak
> és végre látná a tárgy értelmét is hogy a sima arrays.sort-nál
> nagyságrendekkel gyorsabb kódot tudott írni. Nekem pl olcsó 15 wattos gagyi
> laptopon is 3x sebességgel tudok így rendezni egy 50 millió hosszú
> pseudo-random generált int-ből álló tömböt. Egy 64 magos szerver procin már
> ég és föld különbség lenne...
>
> Mit gondoltok, ez jó lenne első beadnak? Sok dolog nem is kell hozzá,
> viszont az alapokat nagyon kell érteni. Második beadba lehetne flancos
> dolgokat rakni, wait notify, reentrant lock, executor stb, de elsőnél azaz
> a mostaninál még az alapok mély megértésére mennénk rá.
>
> Üdv,
> Andor
> _______________________________________________
> Konkurens mailing list
> Konkurens at plc.inf.elte.hu
> https://plc.inf.elte.hu/mailman/listinfo/konkurens
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://plc.inf.elte.hu/pipermail/konkurens/attachments/20211010/636c13e0/attachment-0001.html>


More information about the Konkurens mailing list