From d84f4bad8d77e19f789599617e377988c30c8a86 Mon Sep 17 00:00:00 2001 From: Abhinav Sarkar Date: Fri, 28 Jun 2019 10:41:30 +0530 Subject: [PATCH] Adds LRW cache --- .../net/abhinavsarkar/algorist/LRWCache.java | 80 +++++++++++++++++++ .../algorist/OpenAddressingHashTable.java | 64 +++++++++++++-- 2 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 src/main/java/net/abhinavsarkar/algorist/LRWCache.java diff --git a/src/main/java/net/abhinavsarkar/algorist/LRWCache.java b/src/main/java/net/abhinavsarkar/algorist/LRWCache.java new file mode 100644 index 0000000..918d1da --- /dev/null +++ b/src/main/java/net/abhinavsarkar/algorist/LRWCache.java @@ -0,0 +1,80 @@ +package net.abhinavsarkar.algorist; + +import java.util.Iterator; +import java.util.Optional; + +public class LRWCache implements Iterable +{ + + private final int capacity; + private final OpenAddressingHashTable store; + + public LRWCache(int capacity) { + this.capacity = capacity; + this.store = new OpenAddressingHashTable<>(capacity+1); + } + + public Optional get(K key) { + return store.get(key); + } + + public void remove(K key) { + store.remove(key); + } + + public void put(K key, V val) { + store.put(key, val); + if (store.size() > capacity) { + store.remove(store.iterator().next().key()); + } + } + + public int size() + { + return store.size(); + } + + public Iterator iterator() + { + return new Iterator() + { + private final Iterator> it = store.iterator(); + + @Override + public boolean hasNext() + { + return it.hasNext(); + } + + @Override + public K next() + { + return it.next().key(); + } + }; + } + + public String toString() { + return store.toString(); + } + + public static void main(String[] args) + { + LRWCache cache = new LRWCache<>(4); + cache.put("a", "abhinav"); + cache.put("b", "batman"); + cache.put("c", "carol"); + cache.put("z", "zellman"); + System.out.println(cache); + + cache.put("w", "walker"); + System.out.println(cache); + + cache.put("c", "carly"); + System.out.println(cache); + + cache.put("x", "xander"); + System.out.println(cache); + } + +} diff --git a/src/main/java/net/abhinavsarkar/algorist/OpenAddressingHashTable.java b/src/main/java/net/abhinavsarkar/algorist/OpenAddressingHashTable.java index db52a27..96e9cab 100644 --- a/src/main/java/net/abhinavsarkar/algorist/OpenAddressingHashTable.java +++ b/src/main/java/net/abhinavsarkar/algorist/OpenAddressingHashTable.java @@ -9,15 +9,21 @@ public class OpenAddressingHashTable implements Iterable head; private Entry tail; + private int size; public OpenAddressingHashTable(int initialCapacity, ProbingStrategy probingStrategy) { this.store = new Object[initialCapacity]; this.probingStrategy = probingStrategy; } + public OpenAddressingHashTable(int initialCapacity) + { + this(initialCapacity, new LinearProbing()); + } + public Optional get(K key) { int trial = 0; int baseIndex = calcIndex(key, store.length); @@ -75,7 +81,8 @@ public class OpenAddressingHashTable implements Iterable implements Iterable implements Iterable nEntry) + private void linkNewEntry(Entry nEntry) { if (head == null) { @@ -105,6 +115,28 @@ public class OpenAddressingHashTable implements Iterable entry) + { + if (head == null) + { + head = entry; + } else if (entry == head) { + if (entry.next != null) { + head = entry.next; + tail.next = entry; + entry.prev = tail; + tail = entry; + } + } else if (entry != tail) { + entry.prev.next = entry.next; + entry.next.prev = entry.prev; + tail.next = entry; + entry.prev = tail; + entry.next = null; + tail = entry; + } + } + public void remove(K key) { int trial = 0; int baseIndex = calcIndex(key, store.length); @@ -118,15 +150,16 @@ public class OpenAddressingHashTable implements Iterable entry) + private void unlinkEntry(Entry entry) { if (head == entry) { head = entry.next; @@ -142,6 +175,10 @@ public class OpenAddressingHashTable implements Iterable implements Iterable prev; private Entry next; + public Entry(K key, V val) { this.key = key; this.val = val; } + + public K key() + { + return key; + } + public V val() + { + return val; + } public String toString() { return "<" + key + "," + val + ">"; } @@ -239,9 +286,11 @@ public class OpenAddressingHashTable implements Iterable implements Iterable