Kezdőoldal » Számítástechnika » Programozás » Új algoritmusok c. könyv. Ezt...

Új algoritmusok c. könyv. Ezt a néhány dolgot jól értem?

Figyelt kérdés

Szóval az lenne a konkrét kérdésem hogy leírom azt az 1-2 részt ami nem teljesen világos, és mondjátok meg hogy korrekt-e vagy sem.


1. fejezet


1. kérdés. Bemutatja a beszúró és az összefésülő rendezést. Beszúró rendezés: c1 * n^2; összefésülő rendezés: c2 * n * log2(n) a futási idő. De a fejezetben ezt mégis műveletek számaként kezeli a példafeladatban ami először eléggé bezavart, de a 2. fejezetben olvastam hogy futási idő = elemi műveletek száma. Ez korrekt?


2. kérdés. Tehát a beszúró rendezés n bemenet esetén c1 * n^2 elemei műveletet hajt végre. Ez korrekt?


3. kérdés. A c1, c2 függetlenek n-től, a fejezetből nekem az jött le hogy a számítógépre, a program megírására stb jellemző állandó. Tulajdonképpen ez az IMPLEMENTÁCIÓ (környezet) egy gyorsasági jellemzője?


4. kérdés. Ha veszünk egy számítógépet, akkor megadjuk a sebességét, tehát

elemi műveletek száma / egységnyi idő

Ha az adott algoritmus ezen a számítógépen fut, akkor a futás ideje (ez NEM ugyanaz mint fentebb a futási idő ugye?):

algoritmus elemei műveleteinek száma/számítógép sebessége


5. kérdés. Az egyik feladat. A kérdés az, hogy milyen n értékekre lesz jobb a 8n^2 futásidejű rendezés mint a 64n*log2(n) rendezés. Az hogy "jobb" azt jelenti h kevesebb művelet elvégzésére van szükség, vagy kisebb futási idővel, tehát a feladat megoldása a

8n^2 < 64n*log(2)n

egyenlőtlenség megoldásai ugye?


Vagyis, ha pl az egyenlőtlenség két oldalán álló kifejezéseket ábrázolom függvényként, megnézem hogy a 8n^2 görbéje hol alacsonyabb a 64n*log(2)n görbéjénél, és ez a megoldás ugye? Persze algebrai úton is megoldható.



Elnézést ha a megfogalmazás nem teljesen korrekt, de kb jól értem a dolgokat? Ez a futási idő nem teljesen tiszta.


Megköszönném a segítségeteket, üdv


2013. okt. 28. 20:38
 1/9 anonim ***** válasza:

Ezt a futásidő - bonyolultság - futási sebesség dolgot úgy lehet megérteni, ha közben milliós, milliárdos nagyságrendekben gondolkodsz.


10, 20, 100 szám rendezésénél teljesen mindegy hogy mit használsz, a futásidő is pár milliszekundum (kivéve talán a Bogosort).


Viszont ha sok számod van, akkor nagyságrendben a c-hez képest az n-es tag kerül előtérbe. Tehát hiába nagyobb a log2(n) bonyolultságú algoritmusod futásideje az n^2-esnél mondjuk 100-ig, ha utánna kegyetlenül megugrik és évekig rendezné azt a sorozatot, amit a log2(n) bonyolultságú csak egy napig.



Ennek az egésznek úgy van értelme, hogy nagyságrendileg felméred mennyi adatod lehet, milyen gyors a vas, mennyi a memória (az algoritmusok memóriaigénye is ilyen változó, 1-től n-ig) és ezek alapján választasz megfelelőt a sok közül.


És programozz ilyeneket sokat, nézegesd a futásidőt, mérj, kísérletezz.

Gondolkodtató példákat találsz a projecteuler.com-on ilyen témában.

2013. okt. 28. 22:01
Hasznos számodra ez a válasz?
 2/9 A kérdező kommentje:

Nagyon köszönöm a válaszodat. De sajnos a legtöbb kérdésem megválaszolatlanok maradtak :S, sőt további néhány kérdés merült fel:


6. kérdés. Mit értünk bonyolultság alatt? Ha beszúró rendezésnek n^2 a bonyolultsága, logikusnak tűnik hogy az összefésülőnek n*log2(n) és éppen érteném, de írtad hogy az összefésülőnek log2(n), szval nem értem.


7. kérdés. A rendezéseknél meg van adva hogy mennyi a futásideje, de később ha az algoritmust implementálják bejön egy másik futásidő és a kettő összezavar. Ezt csak úgy tudom elképzelni hogy:

beszúró rendezés futási ideje = c*n^2 = t(n)

Ezt úgy kell érteni hogy a számítógép/pontosabban a rendszer egy egységnyi idő alatt egy elemi műveletet hajt végre. tehát

t(n) = c*n^2 / 1

Ahol az osztó 1 a rendszer sebessége, aminek mértékegysége: elemi művelet/egységnyi idő

Abban az esetben t(n) a futási idő. Azonban ez sosem igaz, pl 10^6 elemi műveletet hajt végre 1s alatt, tehát a futási idő:

t(n) = c*n^2 /( 10^6/s )


Az osztónak és az osztandó nevezőjének nincs külön mértékegysége, de ezek kiesnek, így s lesz a végeredmény mértékegysége.


8. kérdés. Viszont ekkor már a futási idő != elemi műveletek száma, ugye? (a 7. kérdés végére gondolok, ha az algoritmus implementálva van).


Ez így konkrétan nincs leírva a könyvbe, de csak így tudom elképzelni a futási időt. Nagyon kérlek, ha nemjó javítsatok ki.


Azt értem hogy nagyságrendileg n, milliós értékek, lesz vhol egy váltási érték amire az összefésülő jobban teljesít stb. De most nem ez a kérdés.


Megköszönném ha segítenétek. Üdv

2013. okt. 29. 08:27
 3/9 anonim ***** válasza:

"6. kérdés. Mit értünk bonyolultság alatt?"


A számítógéptudomány ezt a problémát úgy közelíti meg,

hogy egy feladat elvégzéséhez szükséges számítástechnikai erőforrások (idő, tár, prog-

ram, kommunikáció) mennyiségével méri a feladat bonyolultságát, számszerű összefüggéseket ad meg rá.


"Ha beszúró rendezésnek n^2 a bonyolultsága, logikusnak tűnik hogy az összefésülőnek n*log2(n) és éppen érteném, de írtad hogy az összefésülőnek log2(n), szval nem értem. "


Nem jól írta, log2(n) nem is lehet semmilyen általános rendező algoritmus futási ideje.


"7. kérdés. A rendezéseknél meg van adva hogy mennyi a futásideje, de később ha az algoritmust implementálják bejön egy másik futásidő és a kettő összezavar."


Algoritmus futási ideje:El kell rugaszkodni a fizikai idő fogalmától. A terminálsásig szükséges elemi műveletek száma. Minden műveletnél meg kéne határozni hogy mennyi elemi műveletből áll és melyik műveletet hányszor hajtotta végre. (Ha fizikai időt elemeznénk akkor még bejönne egy tényező főleg ha nem valós idejű multikasztos rendszeren futtatjuk, ami azért van mert más algoritmusok is futnak a miénken kívül, akkor függne az operációs rendszertől, milyen prioritással fut, a hardvertől (mennyi processzor van, mennyi mag, melyik milyen gyors). Csak valószínűségeket számíthatnánk. Ezért jön ki sokszor más idő ha sokszor lefuttatjuk és lemérjük ugyanarra az inputra, még ha csak milisec különbségek lesznek.) Fizikai időt azon kívül hogy rendkívül elbonyolítja azért sem számolunk mert nem szolgál új információval az algoritmussal kapcsolatban. A c1,c2 stb. konstansokat elegendő 1-nek venni, így is elegendően pontosak vagyunk, nem érdekel minket hogy 10x vagy 100x több vagy kevesebb a futási idő mert konstansszor több vagy kevesebb. Mindegy hogy pentium1-es gépen futtatom vagy intel core i7-es gépen, lehet hogy 50x lassabban fut a pentium1-es gépen, ez a gép jellemzője nem az algoritmusé. Az is mindegy hogy egy értékadó művelet hány elemi műveletből áll, a lényeg hogy konstans számú, mert algoritmusokat elemzünk nem fizikai gépeket. Erre vannak az aszimptotikus jelölések. c1*n*log2(n), nem szokták írni hogy hányas alapú logaritmus, az is mindegy igazából mert a különböző alapú logaritmusok konstans szorzóban térnek el. Erre írják hogy O(n*log(n)).


Van még kérdés?

2013. okt. 29. 14:47
Hasznos számodra ez a válasz?
 4/9 anonim ***** válasza:

Megpróbálom akkor sorban, remélem tudok segíteni:)


1. futási idő ~ elemi műveletek száma

Egyenesen arányos vele, mértékegységük egészen más.

(hasonló: t = s / v)

A számítási sebesség mértékegysége: [link]


2. c1 az egy elem rendezéséhez szükséges elemi lépések számát jelöli. Korrekt.


3. Az implementáció a konkrét megvalósítása az algoritmusnak, programkóddal. c1 az implementációt jellemzi.


4. A konkrét implementáció is mindig más idő alatt fut, más gépen meg főleg. Viszont az elemi műveletek száma (c1) nem változik.


5. A megoldásod helyes, csak ez lényegtelen. Ránézésre látszik, hogy az n^2 hamar otthagyja az n*log2(n)-t, ahol fontos a futási idő(sok) ott sosem lesz jobb az n^2.


6. Hülyeséget írtam. A bonyolultság a domináns tag, ami nagy számoknál "átveszi a vezetést".

O( 1500 + 2*n + n^2 ) = O(n^2)

O( 3 + n^12 + n! ) = O(n!)

[link]


7-8. Igen, remélem fejlebb megválaszoltam.


Remélem nem írtam nagyon hülyeségeket.

2013. okt. 29. 15:00
Hasznos számodra ez a válasz?
 5/9 A kérdező kommentje:

Oké, a legfontosabb kérdésem: (7. kérdés)


"Ezt csak úgy tudom elképzelni hogy:

beszúró rendezés futási ideje = c*n^2 = t(n)

Ezt úgy kell érteni hogy a számítógép/pontosabban a rendszer egy egységnyi idő alatt egy elemi műveletet hajt végre. tehát

t(n) = c*n^2 / 1

Ahol az osztó 1 a rendszer sebessége, aminek mértékegysége: elemi művelet/egységnyi idő

Abban az esetben t(n) a futási idő. Azonban ez sosem igaz, pl 10^6 elemi műveletet hajt végre 1s alatt, tehát a futási idő:

t(n) = c*n^2 /( 10^6/s ) "


Ez baromság vagy ígyvan?


Tehát futási idő = elemi műveletek száma, és a futási idő itt nem a fizikai időt jelenti. Ez korrekt?


Ha az algoritmust implementálják oda jön be egy futási idő, de az t(n) osztva sebesség, korrekt?


Tehát egy probléma bonyolultsága = a megadott képletek "c" szorzótényező nélkül, korrekt?


"1. futási idő ~ elemi műveletek száma

Egyenesen arányos vele"


Ez arra az esetre vonatkozik ha az algoritmust implementálták ugye? Mert ott van hogy sebesség = elemi műveletek / futási idő, viszont elemi algoritmus szintjén aztmondtuk hogy a futási idő jelenti az elemi műveletek számát a terminálásig.


Nagyon szépen köszönöm a segítségeteket.

2013. okt. 29. 18:48
 6/9 anonim ***** válasza:

"Ez baromság vagy ígyvan?"


Általában közelítőleg úgy van, a korábbi válaszomba benne van a válasz hogy miért nem. Valós idejű rendszeren lehet pontosan úgy mint ahogy írtad.


"Tehát futási idő = elemi műveletek száma, és a futási idő itt nem a fizikai időt jelenti. Ez korrekt?"


Első megközelítésben igen, de algoritmus futási ideje szempontjából bonyolultsági kategóriát szoktak érteni.

[link]


Amit a kolléga írt FLOPS-ot az csak az egyik mértékegysége, van a MIPS is, de itt nem ezekről van szó.


"Ha az algoritmust implementálják oda jön be egy futási idő, de az t(n) osztva sebesség, korrekt?"


A valóság általában ennél bonyolultabb, speciális valós idejű rendszereknél lehet pont így.


"Tehát egy probléma bonyolultsága = a megadott képletek "c" szorzótényező nélkül, korrekt? "


Nem (elég pongyolán fogalmaztál), ez a bonyolultságának egy jellemzője. Algoritmusok bonyolultságával a bonyolultságelmélet foglalkozik.


""1. futási idő ~ elemi műveletek száma

Egyenesen arányos vele"


Ez arra az esetre vonatkozik ha az algoritmust implementálták ugye? Mert ott van hogy sebesség = elemi műveletek / futási idő, viszont elemi algoritmus szintjén aztmondtuk hogy a futási idő jelenti az elemi műveletek számát a terminálásig. "


Kb igen. (Egyértelmű.)

2013. okt. 29. 22:10
Hasznos számodra ez a válasz?
 7/9 A kérdező kommentje:
Non köszönöm a segítségeteket, üdv
2013. okt. 30. 16:31
 8/9 A kérdező kommentje:
Nagyon** köszönöm
2013. okt. 30. 16:32
 9/9 anonim ***** válasza:
Nagyon szívesen, üdv.
2013. okt. 30. 21:34
Hasznos számodra ez a válasz?

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!