Fő tartalom
Tantárgy/kurzus: Számítástudomány > 1. témakör
4. lecke: Minimumkiválasztásos rendezés- Rendezés
- Feladat: A kártyacsere programkódja
- Minimumkiválasztásos rendezés pszeudokódja
- Feladat: Találd meg a minimumot a résztömbben
- Feladat: Minimumkiválasztásos rendezés implementálása
- Minimumkiválasztásos rendezés elemzése
- Feladat: Minimumkiválasztásos rendezés megjelenítése
© 2024 Khan AcademyFelhasználási feltételekAdatkezelési tájékoztatóSüti figyelmeztetés
Minimumkiválasztásos rendezés elemzése
A minimumkiválasztásos rendezés végigveszi a tömb indexeit; minden indexre meghívja az , akkor a tömbben index van.
indexOfMinimum
és swap
függvényeket. Ha a tömb hossza Mivel a ciklus törzse két programsort tartalmaz, azt gondolhatod, hogy a minimumkiválasztásos rendezés során utasítás hajtódik végre. De ez nem igaz! Ne feledd: az
indexOfMinimum
és a swap
függvények, amikor azokat meghívod, ott is programsorok vannak!Hány programsor hajtódik végre a
swap
egy hívásakor? A szokásos implementációban három sor, úgyhogy a swap
minden egyes meghívása konstans idő alatt fut le.Hány programsor hajtódik végre az -szer fut le. Ha a résztömb 6 hosszúságú, akkor a ciklustörzs 6-szor fut le.
indexOfMinimum
egy hívásakor? Itt az indexOfMinimum
belsejében levő ciklust kell figyelembe venni. Hányszor fut le a ciklus az indexOfMinimum
egy hívása során? Ez függ a résztömb méretétől. Ha a résztömb megegyezik a teljes tömbbel (ez az eset az első kereséskor), akkor a ciklustörzs Például tegyük fel, hogy a teljes tömb 8 elemet tartalmaz. Gondold végig, hogy ebben az esetben hogyan működik a minimumkiválasztásos rendezés!
- Az
indexOfMinimum
első hívásakor a tömb minden elemét meg kell vizsgálni, ezért azindexOfMinimum
ciklustörzse 8-szor fut le. - Az
indexOfMinimum
második hívásakor a résztömböt az 1.-től a 7. indexig kell megvizsgálni, úgyhogy azindexOfMinimum
ciklustörzse 7-szer fut le. - A harmadik hívás esetén a résztömböt a 2.-tól a 7. indexig vizsgálja; a ciklustörzs 6-szor fut le.
- A negyedik hívás alkalmával a résztömböt a 3.-tól a 7. indexig nézi; a ciklustörzs 5-ször fut le.
- …
- Az
indexOfMinimum
nyolcadik és egyben utolsó hívásakor a ciklustörzs csak 1-szer fut le.
Ha összeadjuk, hogy az
indexOfMinimum
ciklustörzse hányszor fut le, akkor ezt kapjuk: 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 36 .Széljegyzet: Számok összegzése 1-től -ig
Hogyan lehet gyorsan kiszámítani a 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 összeget? Mutatok egy cseles megoldást. Végezzük el az összeadást egy trükkös sorrendben! Először végezzük el a 8 + 1 műveletet, a legkisebb és a legnagyobb számot összeadva. Az eredmény 9. Ezután jön 7 + 2, a második legnagyobb és második legkisebb szám összege. Érdekes módon megint 9 az eredmény. És 6 + 3? Az is 9. Végül jön 5 + 4. Ennek az eredménye is 9! Összefoglalva a fentieket ezt látjuk:
Négy számpárosunk van és mindegyik 9-et ad eredményül. Ha általánosan fogalmazzuk meg: egész számok sorozatának összeadását az alábbi képlet alapján számolhatjuk ki:
- Add össze a legnagyobb és a legkisebb számot!
- Szorozd meg a párok számával!
Mi van abban az esetben, ha a sorozatban páratlan számú elem van, és így nem tudod párosítani a számokat? Nem számít! A középső, pár nélkül maradt számot egyszerűen fél párként kell értelmezni. Például adjuk össze a következő sorozatot: 1 + 2 + 3 + 4 + 5. Két teljes párunk van (1 + 5 és 2 + 4, mindkettő 6-ot eredményez), és egy „fél pár” (3, ami a 6 fele), ez 2,5 párt eredményez. Elvégezzük a szorzást: , és megkapjuk a jó eredményt.
Mi a helyzet, ha 1-től -ig kell összeadni a számokat? Ezt számtani sorozatnak hívjuk. A legkisebb és a legnagyobb szám összege . Mivel összesen számunk van, a párok száma (függetlenül attól, hogy páros vagy páratlan). Ezért a számok összege 1-től -ig , ami . Próbáld ki ezt a képletet, ahol és .
A minimumkiválasztásos rendezés futási idejének aszimptotikus elemzése
A minimumkiválasztásos rendezés teljes futási ideje három részből áll össze:
- Az
indexOfMinimum
meghívásaiból adódó futási idő. - A
swap
meghívásaiból adódó futási idő. - A
selectionSort
függvény ciklusának további utasításaiból adódó futási idő.
A 2. és 3. pont könnyen meghatározható. Tudjuk, hogy a -szer kerül végrehajtásra. Az aszimptotikus jelölésrendszer használatával a . A iterációban, amihez szintén idő kell.
swap
és az egyes függvényhívások futási ideje konstans és swap
összes hívásához szükséges idő selectionSort
ciklusában még szerepel tesztelés és a ciklusváltozó növelése, valamint az indexOfMinimum
és swap
meghívása, amihez konstans idő tartozik minden egyes Ami az 1. részt illeti, az , majd , ezután és így tovább. Láttuk, hogy ez az összeg egy számtani sorozat, aminek értéke , avagy . Ezért az . A Θ-jelölés szerint a konstans tényező elhagyható, és az 1/2 sem számít, valamint az alacsonyabb rendű tag sem. Eredményül tehát azt kaptuk, hogy az .
indexOfMinimum
összes hívásának futási idejét, a nehezén már túl vagyunk. Az indexOfMinimum
-ban található ciklus minden egyes iterációjának futási ideje konstans. Az iterációk száma az első híváskor indexOfMinimum
hívások összértéke valamilyen konstansszor indexOfMinimum
összes hívásának futási ideje A három rész futási idejét összeadva az , a és kell a a szignifikáns rész, így azt mondhatjuk, hogy a minimumkiválasztásos rendezés futási ideje .
indexOfMinimum
hívások futási ideje swap
hívásoké selectionSort
ciklusának többi utasításaihoz. A Megfigyelhetjük azt is, hogy a minimumkiválasztásos rendezés szempontjából nincs különösen kedvező, vagy különösen kedvezőtlen eset. Az iterációt hajt végre az inputtól függetlenül. Tehát azt állítjuk, hogy a minimumkiválasztásos rendezés futási ideje minden esetben .
indexOfMinimum
-ban található ciklus minden esetben Vizsgáljuk meg, hogy a futási idő hogyan befolyásolja a valós végrehajtás idejét! Mondjuk, hogy a minimumkiválasztásos rendezés megközelítőleg másodperc alatt rendez értéket. Kezdjünk egy viszonylag kis -nel, mondjuk . Akkor a minimumkiválasztásos rendezés futási ideje körülbelül másodperc. Ez meglehetősen gyors. De mi van akkor, ha ? Akkor a futási idő már másodperc lesz. A tömb 10-szeresére nőtt, de a futási idő 100-szorosára emelkedett. És mi van akkor, ha ? Akkor a rendezéshez szükséges idő másodperc, ami valamivel több, mint 11,5 nap. Ha a tömb mérete ezerszeresére nő, akkor a futási idő a milliószorosára fog nőni!
Ez a fejezet a Dartmouth Computer Science két professzora, Thomas Cormen és Devin Balkcom, valamint a Khan Academy informatika tanmenetfejlesztő csapatának együttműködésében készült. A tartalom a CC-BY-NC-SA licenc alatt engedélyezett.
Szeretnél részt venni a beszélgetésben?
Még nincs hozzászólás.