Masīvu šķirošanas metodes Rubīnā

Kārtošana jau no agras dienas bija datoru zinātnieku satraukums. To bija daudz algoritmi kas ienāca lietošanā un vairs netika izmantoti, un joprojām mūsdienās jauni algoritmi stumj veiktspējas robežas. Tā kā esat augsta līmeņa valoda, šķirošanas algoritmus jūs neieviesīsit Rubīns ja jums rūp veiktspēja, un turklāt - šķirošana Masīvi un citas kolekcijas ir vēl citas lietas, ko Rubīns dara jūsu labā.

Tehniski šķirošana ir darbs, ko veic modulis Enumerable. Enumerable modulis ir tas, kas visus Ruby kolekciju veidus saista kopā. Tas nodarbojas ar kolekciju atkārtošanu, noteiktu elementu šķirošanu, meklēšanu un atrašanu utt. Tas, kā kolekcija šķirojama kā Enumerable, ir nedaudz noslēpums, vai vismaz tā tam vajadzētu palikt. Faktiskajam šķirošanas algoritmam nav nozīmes, vienīgais, kas jums jāzina, ir tas, ka kolekcijas objekti tiek salīdzināti, izmantojot “kosmosa kuģa operatoru”.

"Kosmosa kuģa operators" uzņem divus objektus, salīdzina tos un pēc tam atgriež -1, 0 vai 1. Tas ir nedaudz neskaidri, bet operatoram pašam nav ļoti precīzi definēta uzvedība. Ņemsim, piemēram, ciparu objektus. Ja jums ir divi skaitliski objekti

instagram viewer
a un b, un novērtēt a <=> b, ko izteiksme novērtēs? Ciparu gadījumā to ir viegli pateikt. Ja a ir lielāks par b, tas būs -1, ja tie ir vienādi, tas būs 0 un, ja b ir lielāks par a, tas būs 1. To izmanto, lai šķirošanas algoritmam pateiktu, kuram no diviem objektiem vajadzētu būt pirmajam masīvs. Tikai atceraties, ka, ja kreisās puses operands ir pirmais masīvā, tam jānovērtē līdz -1, ja labās puses pirmajam jābūt pirmajam, tam jābūt 1 un, ja tas nav svarīgi, tam jābūt 0.

Tas ne vienmēr notiek pēc šādiem sakoptiem noteikumiem. Kas notiek, ja jūs izmantojat šo operatoru diviem dažādiem objektiem? Jūs, iespējams, iegūsit izņēmumu. Kas notiek, kad zvana 1 <=> 'pērtiķis'? Tas būs līdzvērtīgs izsaukumam 1. <=> ('pērtiķis'), kas nozīmē, ka tiek izmantota faktiskā metode pa kreisi operands un Fixnum # <=> atgriež nulli, ja labās puses operands nav skaitlis. Ja operators atgriež nulli, šķirošanas metode radīs izņēmumu. Tāpēc pirms masīvu šķirošanas pārliecinieties, vai tajos ir objekti, kurus var kārtot.

Otrkārt, nav definēta kosmosa kuģa operatora faktiskā izturēšanās. Tas ir noteikts tikai dažām pamatklasēm, un jūsu pielāgotajām klasēm tas ir pilnībā atkarīgs no jums, ko vēlaties, lai tās nozīmētu. Ja jums ir Studentam klasē jūs varat skolēnus kārtot pēc uzvārda, vārda, pakāpes līmeņa vai to kombinācijas. Tāpēc vienmēr jāapzinās, ka kosmosa kuģa operatora izturēšanās un šķirošana nav precīzi definēta ne kā vien bāzes tipiem.

Jums ir ciparu objektu masīvs un vēlaties tos kārtot. Ir divas galvenās metodes, kā to izdarīt: kārtot un kārtot!. Pirmais izveido masīva kopiju, to sakārto un atdod. Otrais sakārto masīvu vietā.

Tas ir diezgan pašsaprotami. Tātad, pieņemsim to par iecirtumu. Ko darīt, ja nevēlaties paļauties uz kosmosa kuģa operatoru? Ko darīt, ja vēlaties pilnīgi atšķirīgu izturēšanos? Šīs divas šķirošanas metodes izmanto izvēles bloka parametru. Šim blokam ir divi parametri, un tam vajadzētu dot vērtības tāpat kā kosmosa kuģa operatoram: -1, 0 un 1. Tātad, ņemot vērā masīvu, mēs vēlamies to sakārtot, lai visas vērtības, kuras dalāmas ar 3, būtu pirmās, bet visas pārējās - pēc. Faktiskajai kārtībai šeit nav nozīmes, tikai tas, ka vispirms dalās ar 3.

Kā tas darbojas? Vispirms ņemiet vērā šķirošanas metodes bloķēšanas argumentu. Otrkārt, ņemiet vērā modulo dalījumu, kas veikts bloka parametros, un kosmosa kuģa operatora atkārtotu izmantošanu. Ja viens ir 3 reizinājums, modulo būs 0, pretējā gadījumā tas būs 1 vai 2. Tā kā 0 šķiro pirms 1 vai 2, šeit ir svarīgi tikai modulo. Bloķēšanas parametra izmantošana ir īpaši noderīga masīvos, kuros ir vairāk nekā viena veida elementi, vai arī, ja vēlaties kārtot pielāgotajās klasēs, kurām nav definēta kosmosa kuģa operatora.

Ir vēl viena veida saukšanas metode Kārtot pēc. Tomēr vispirms vajadzētu saprast masīvu un kolekciju tulkošanu ar karti, pirms ķerties pie sort_by.

instagram story viewer