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.
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 ;Perl | |
---|---|
Emberek |
|
Dolgok | |
Keretrendszerek |
|
|