stabil válogatás

A stabil (stabil) válogatás - válogatás, amely nem változtatja meg a relatív sorrendben a rendezve ahol az elemeknek ugyanaz kulcsokat.

A fenntarthatóság egy nagyon fontos jellemzője a rendezési algoritmus, de mégis, akkor szinte mindig érhető el, ha meghosszabbítjuk az eredeti kulcsok miatt bővebb információkat az eredeti sorrendben. Annak ellenére, hogy a látszólagos szükségességét, a neve is mutatja, a stabilitás nem szükséges a pontossággal válogatja és gyakran nem tartják be, hiszen szinte mindig biztosítani kell a további memóriát és időt.

Amikor válogatás a nyilvántartást a form [vezetéknév, keresztnév] az alapvető értékek a nevét Szergej Ivanov és Ivan Ivanov ugyanaz lesz, így egy stabil válogatás szüntelenül Szergej és Ivan helyek (Python 3. válogatás timsort [1]):

Ennek eredményeként a bejegyzések vannak sorolva, vezetéknevét, csak miközben az eredeti sorrendben között rekordokat azonos elnevezések:

Szelektálás, amely a fő eleme a konverziós költséges Burrows - Wheeler. Stabilnak kell lennie.

Algoritmusok stabil válogatás

Rendezés egyesül további memória

Az algoritmus, hogy rendezés volt végrehajtva első rekurzív felosztás részei az eredeti tömb, amíg minden egyes tömb nem egy vagy nulla elemek (minden rekurzió lépésben az elválasztást végezzük fél). Ezt követően, a részét a párok „egyesítése”. A teljes komplexitása az algoritmus - O (n log n), ahol az algoritmus O (n) több memóriát tömbök tárolására fúziós.

Szortírozás alkalmazásával stabil Division

Ez az algoritmus hasonló a gyors rendezési algoritmusnak. Csakúgy, mint egy gyors rendezési algoritmusnak, az algoritmus forrás tömbben van két részre osztjuk, - egy a valamennyi elem kisebb, vagy egyenlő, mint valamilyen tartóelem, és a másik - nagyobb vagy egyenlő. Majd rekurzívan osztott részek tömb rendezve azonos módon. A különbség az algoritmus és a gyors rendezés algoritmus itt használt helyett stabil osztály instabil. Az alábbiakban bemutatjuk a végrehajtását az algoritmus pszeudokódját:

A stabil Division tömb O (n log n) elemi műveletek. Mivel a „mélység” által megvalósított rekurzív származású átlagos esetben O (log n) a teljes összetettségét az algoritmus O (n log² n). Ebben az algoritmusban végrehajtásához szükséges rekurzív O (log n) verem, míg a legrosszabb esetben a teljes komplexitása O (n log n ²) és O (n) memóriát.

Merge sort algoritmusok nélkül további memóriát

Az összes alábbi algoritmusok alapulnak az egyesülés már rendezve tömbök használata nélkül további memóriát túli O (log² n) köteg (ami - .. Az úgynevezett állapot minimális memória [2]), és csak abban különböznek, összevonása algoritmus. A következő pszeudokód algoritmusok (egyesítése algoritmusok - egy eljárás Egyesítés - mutatjuk külön-külön módszer):

Pratt algoritmus

Az algoritmus Pratt rendezve tömbök két elem α és β. amelyek a medián a tömb elemekből álló mindkét tömbök. Ezután az egész tömböt is képviselteti magát aαbxβy. Ezt követően, a ciklikus eltolás elemeket, miáltal megkapjuk a következő szekvenciával: axβαby. További fúziós algoritmus rekurzív megismételjük ax és tömbök.

A ciklikus eltolás elemet igényel O (n) az elemi műveletek és O (1) további memória, és a keresési két medián már rendezve tömbök - O (log² n) az elemi műveletek és O (1) további memória. Mivel hajtjuk O (log n) rekurzió lépések, a komplexitása ilyen algoritmus összevonása O (n log n), és a teljes komplexitása rendezési algoritmus - O (n log² n). Ebben az algoritmusban igényel O (log² n) köteg.

Algoritmus nélkül Keresés Media

Keresés Media tud megszabadulni az előző algoritmust a következő. A nagyobb a két középső elem tömbök választhat α (támasztóelem). Továbbá, a kisebb tömb megtalálja az első előfordulása az elem helyzetét nagyobb vagy egyenlő mint α. Mi úgy hívjuk p. Ezt követően, a ciklikus eltolás elemek ugyanúgy, mint az algoritmus Pratt (aαbxβy → axβαby), és végezzük rekurzívan összevonása a kapott részek. A pszeudo-kód egyesülő algoritmust mutatunk be.

FindFirstPosition eljárások és FindLastPosition gyakorlatilag azonos eljárással a bináris keresés:

Ellentétben Pratt algoritmus Az algoritmus partíció lehet lényegében egyenlő. De még a legrosszabb esetben az algoritmus megtöri a teljes körű [a. y] az arány 3: 1 (ha minden eleme a második sáv lesz nagyobb vagy kisebb, mint a referencia, és így mind sávok azonos számú elemet). Ez biztosítja a logaritmikus több rekurzív lépéseket, amikor összevonása bármilyen tömbök. Látjuk tehát, hogy az ugyanolyan módon, mint a Pratt algoritmus, összetettsége az egyesülés az algoritmus O (n log n), összetettsége miatt a rendezési algoritmus - O (n log² n), és a szükséges memóriát - O (log² n).

Stabil szortírozás anélkül, hogy további memória az idő O (n log n)

Hogyan lehet javítani az algoritmusok

  • Minden fenti algoritmusok részlege az eredeti tömb része a rekurzív particionáló lehet állítani, ha az összeg a törés a tömb elég kicsi. Akkor lehet alkalmazni, egy egyszerű rendezési algoritmusok (pl behelyezés sort), amelyről ismert, hogy gyorsabban, mint a bonyolult, ha az input tömb mérete kicsi. Valójában ez a módszer nem csak akkor alkalmazható a algoritmusok itt bemutatott, de bármilyen más algoritmust, ahol egy rekurzív bomlása a forrás tömbben alkalmazunk (például a hagyományos illékony gyorsrendezés). A meghatározott számú input elem, ami szükséges, hogy átmenjen egy egyszerű rendezési algoritmus függ a számítógép.
  • Az algoritmus Pratt algoritmus keresés nélkül, így a medián algoritmus stabil részlege, ahelyett, hogy minden alkalommal rekurzív hívás az összefonódás lehetséges, hogy dinamikusan osztja egy sor átmeneti változókat. Akkor továbbra is terjedhet partíció csak addig, amíg az elemek száma nagyobb tartományban kisebb vagy egyenlő a kapacitással az ideiglenes tömb. Tény, hogy egy bizonyos szakaszában rekurzív keresés nélkül mediánok Pratt algoritmus, és az algoritmus átalakítják egy egyszerű algoritmus az egyesülés. Így. ha elég dinamikus memória rendszer, aszimptotikus idő csökkenthető, hogy O (n log n) helyett O (n log² n).

Kapcsolódó cikkek