Memorare

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 9 noiembrie 2021; verificarea necesită 1 editare .

Memoization (Cache) ( ing.  memorizare din ing.  memorie și ing.  optimizare ) este un exemplu de utilizare a unui cache în dezvoltarea de software, în programare, salvarea rezultatelor executării funcțiilor pentru a preveni recalculările. Aceasta este una dintre metodele de optimizare folosite pentru a accelera execuția programelor de calculator . Înainte de a apela o funcție, verifică dacă funcția a fost apelată anterior:

Memorarea poate fi folosită pentru mai mult decât pentru a accelera un program. De exemplu, este utilizat în analizarea de sus în jos încrucișată într- un algoritm de parsare generalizat de sus în jos [1] .

Deși este legată de memorarea în cache , memorarea este un tip specific de optimizare, care este diferit de metodele de stocare în cache, cum ar fi tamponarea și schimbarea paginilor.

În limbajele de programare logică , memorarea este cunoscută sub denumirea de tabulare.

Exemple de utilizare

Funcția memoize() de mai jos stochează rezultatele fiecărui apel către funcția primită ca [key:value].

// O funcție care generează o cheie pe baza parametrilor const generateKey = args => ( args . map ( x => ` ${ x . toString () } : ${ typeof ( x ) } ` ). join ( '| ' ) / / Rezultat: "x1:number|x2:number|..." ); // Preia o funcție ca parametru const memoize = fn => { const cache = {}; return (... args ) => { // Generează o cheie pentru a stoca rezultatul const key = generateKey ( args ); constval = cache [ cheie ] ; // Verifică dacă există o valoare pentru cheia dată și o returnează dacă există if ( val ) return val ; // Stochează rezultatul unui apel de funcție const res = fn (... args ); cache [ cheie ] = res ; // Returnează rezultatul return res ; }; };

Cu acesta, putem evita reexecutarea calculelor dacă acestea au fost deja efectuate.

// O funcție care găsește suma numerelor de la a la b const sumSeq = ( a , b ) => { console . log ( 'Calculați suma' ); fie r = 0 ; pentru ( fie i = a ; i < b ; i ++ ) r += i ; returnează r ; }; // Memorează funcția sumSeq const mSumSeq = memoize ( sumSeq ); consola . log ( 'Primul apel mSumSeq(2, 5)' ); consola . log ( 'Valoare: ' + mSumSeq ( 2 , 5 )); // Imprimă „9” pe consola consolei . log ( 'Al doilea apel mSumSeq(2, 5)' ); consola . log ( 'Din cache: ' + mSumSeq ( 2 , 5 )); // Imprimă „9” pe consola consolei . log ( 'Apelați mSumSeq(2, 6)' ); consola . log ( 'Calculat: ' + mSumSeq ( 2 , 6 )); // Imprimă „14” pe consolă

Când funcția mSumSeq( 2, 5 ) a fost apelată din nou, programul nu a recalculat suma, a verificat prezența valorii prin cheia [2:număr|5:număr] în cache și din moment ce avea deja fost creat și i s-a atribuit valoarea 9 la primul apel de funcție, această valoare va fi transmisă variabilei val din memoize() și returnată ca argument la console.log().

Acest exemplu arată cea mai simplă aplicare a memorizării în programare, astfel încât este posibil să nu observați modificări semnificative în viteza de lucru, cu toate acestea, această metodă de optimizare poate facilita foarte mult munca procesorului cu calcule matematice încărcate.

Vezi și

Link -uri

Exemple de cod preluate din sursa:

HowProgrammingWorks, Timur Shemsedinov - depozitul Github .

Note

  1. Norvig, Peter. Tehnici de memorare automată cu aplicații pentru analizarea fără context  // Lingvistică computațională. - 1991. - T. 17 , nr 1 . - S. 91-98 .