Schwartz transzformáció

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2017. február 26-án felülvizsgált verziótól ; az ellenőrzések 2 szerkesztést igényelnek .

A Schwartz-transzformáció  a Perl programozási nyelvben megjelent idióma , amely megoldja az elemlisták komplex (számított) attribútumok alapján történő hatékony rendezésének problémáját.

Az ötlet az, hogy a kiszámított elemattribútumokat (például karakterlánc hossza, karakterláncrész, számnégyzet, egyéb képletek és külső lekérdezések) hasonlítsuk össze, és minden elemre egyszer számítsuk ki, és egy ideiglenes tömbbe helyezzük, amelyet aztán a szabványos rendezési függvény rendez. ezeknek az eredményeknek megfelelően, ami után az ideiglenes adatokat eldobjuk. Valójában ez a számított attribútumok gyorsítótárazása (ideiglenes tárolása), mivel a rendezési folyamat során (az elemek összehasonlításakor) többször is használatosak. A Perl nyelvben egy "alapértelmezett változó" használatának köszönhetően ez az algoritmus három függvény egyetlen kifejezésébe illeszkedik, vagyis nagyon röviden és egyértelműen.

Az idióma Randel Schwartzról kapta a nevét , aki valamivel a Perl 5 1994 -es kiadása után mutatta be . A "Schwartz-transzformáció" kifejezést évekig kizárólag a Perl programozási nyelvre használták, de ezt az átalakítást később más programozók más nyelvekre (például Pythonra ) is adaptálták. A Schwartz-transzformációban használt algoritmus létezett néhány programozási nyelvben (konkrét név nélkül), mielőtt a Perl programozói közösségben idiómaként népszerűsítették volna.

Példa

Tegyük fel, hogy a szavak listáját („aaaa”, „a”, „aa”) szóhossz szerint szeretnénk rendezni. Először létre kell hozni egy listát (["aaaa",4], ["a",1], ["aa",2]), majd rendezni kell számértékek szerint, majd a kapott listából (["a" ",1] , ["aa",2], ["aaaa",4]) számok eltávolítása. Az eredmény egy lista lesz ("a", "aa", "aaaa"). A leírt algoritmust Schwartz-transzformációként írjuk le a következőképpen:

@sorted = térkép { $_ -> [ 0 ] } rendezés { $a -> [ 1 ] <=> $b -> [ 1 ] } # numerikus összehasonlító térkép { [ $_ , long ( $_ )] } # karakterlánchossz-számítás @nem rendezett ;