6 Kasım 2018 Salı

Memoization Örüntüsü

Giriş
Açıklaması şöyle.
Memoization is a specific form of caching that involves caching the return value of a function based on its parameters.
Memoization GoF - Flyweight Örüntüsü ile ilişkili ancak nesne saklamak yeriner fonksiyonun sonucunu saklıyor.

Örnek
Elimizde şöyle bir kod olsun
public class SimpleRecursiveFibonacci {

  /** Gets the fibonacci value for n */
  public final BigInteger fibonacci(int n) {
    if (n < 2) {
      return BigInteger.ONE;
    }
    return getFibonacci(n);
  }

  /** Recursively calculates the fibonacci by adding the two previous fibonacci. */
  protected final BigInteger calculateFibbonacci(int n) {
    return fibonacci(n - 2).add(fibonacci(n - 1));
  }

  /** 
   * Somehow get the fibonacci value for n.
   * Could be by calculation, getting it from a cache, or anything.
   */
  protected BigInteger getFibonacci(int n) {
    return calculateFibbonacci(n);
  }
}
Şöyle yaparız
public class MemoizedRecursiveFibonacci extends SimpleRecursiveFibonacci {

  private Map<Integer, BigInteger> cache = new HashMap<>();

  @Override
  protected BigInteger getFibonacci(int n) {
    BigInteger fib = cache.get(n);
    if (fib == null) {
      fib = recursiveCalculateFibbonacci(n);
      cache.put(n, fib);
    }
    return fib;
  }
}

Hiç yorum yok:

Yorum Gönder