From a75f826e1b087a86f67104bf17ba1ccc75481295 Mon Sep 17 00:00:00 2001 From: Abhinav Sarkar Date: Wed, 26 Jun 2019 21:47:56 +0530 Subject: [PATCH] Adds linkedlist, growable array and chainin hash table --- .gitignore | 2 + pom.xml | 24 ++++ src/main/java/net/abhinavsarkar/Algorist.java | 15 +++ .../algorist/ChainingHashTable.java | 108 +++++++++++++++++ .../abhinavsarkar/algorist/GrowableArray.java | 70 +++++++++++ .../abhinavsarkar/algorist/LinkedList.java | 114 ++++++++++++++++++ 6 files changed, 333 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/net/abhinavsarkar/Algorist.java create mode 100644 src/main/java/net/abhinavsarkar/algorist/ChainingHashTable.java create mode 100644 src/main/java/net/abhinavsarkar/algorist/GrowableArray.java create mode 100644 src/main/java/net/abhinavsarkar/algorist/LinkedList.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c38fa4e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +*.iml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d71a75b --- /dev/null +++ b/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + net.abhinavsarkar.java + argorist + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + + \ No newline at end of file diff --git a/src/main/java/net/abhinavsarkar/Algorist.java b/src/main/java/net/abhinavsarkar/Algorist.java new file mode 100644 index 0000000..f49ee86 --- /dev/null +++ b/src/main/java/net/abhinavsarkar/Algorist.java @@ -0,0 +1,15 @@ +package net.abhinavsarkar; + +import net.abhinavsarkar.algorist.LinkedList; + +public class Algorist +{ + // BST with all ops + // Red-black tree + // Hash Table - open addressing and chaining + // Linked BST + // Ranked BST + + + +} diff --git a/src/main/java/net/abhinavsarkar/algorist/ChainingHashTable.java b/src/main/java/net/abhinavsarkar/algorist/ChainingHashTable.java new file mode 100644 index 0000000..0eabbba --- /dev/null +++ b/src/main/java/net/abhinavsarkar/algorist/ChainingHashTable.java @@ -0,0 +1,108 @@ +package net.abhinavsarkar.algorist; + +import java.util.Optional; + +public class ChainingHashTable +{ + private Object[] store; + + public ChainingHashTable(int capacity) { + if (capacity <= 0) { + throw new IllegalArgumentException("Capacity too small"); + } + this.store = new Object[capacity]; + } + + public Optional get(K key) { + int index = calcIndex(key); + + LinkedList> entries = (LinkedList>) store[index]; + if (entries == null) { + return Optional.empty(); + } else { + return entries.forEach(h -> { + if (h.key == key) { + return Optional.of(h.val); + } + return Optional.empty(); + }); + } + } + + public void put(K key, V val) { + int index = calcIndex(key); + + LinkedList.Node> vNode = new LinkedList.Node<>(new Entry<>(key, val), null); + if (store[index] == null) { + store[index] = new LinkedList<>(vNode); + } else { + LinkedList> entries = (LinkedList>) store[index]; + Optional ret = entries.forEach(h -> { + if (h.key == key) + { + h.val = val; + return Optional.of(0); + } + return Optional.empty(); + }); + if (!ret.isPresent()) + { + entries.prepend(vNode); + } + } + } + + private int calcIndex(K key) + { + return key.hashCode() % store.length; + } + + private static class Entry { + private K key; + private V val; + public Entry(K key, V val) { + this.key = key; + this.val = val; + } + public String toString() { + return "<" + key + "," + val + ">"; + } + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < store.length; i++) { + LinkedList> entries = (LinkedList>) store[i]; + if (entries != null) + { + sb.append("<" + i + ": " + entries + ">, "); + } + } + + sb.delete(sb.length()-2, sb.length()); + + return "{" + sb + "}"; + } + + public static void main(String[] args) + { + ChainingHashTable table = new ChainingHashTable<>(20); + table.put("a", "abhinav"); + table.put("b", "batman"); + table.put("c", "carol"); + table.put("c", "carly"); + table.put("z", "zellman"); + table.put("w", "walker"); + + System.out.println(table.get("a")); + System.out.println(table.get("b")); + System.out.println(table.get("c")); + + System.out.println(table.get("A")); + System.out.println(table.get("B")); + System.out.println(table.get("C")); + + System.out.println(table); + } + +} diff --git a/src/main/java/net/abhinavsarkar/algorist/GrowableArray.java b/src/main/java/net/abhinavsarkar/algorist/GrowableArray.java new file mode 100644 index 0000000..2783941 --- /dev/null +++ b/src/main/java/net/abhinavsarkar/algorist/GrowableArray.java @@ -0,0 +1,70 @@ +package net.abhinavsarkar.algorist; + + +public class GrowableArray +{ + + private Object[] store; + + public GrowableArray(int initialCapacity) { + if (initialCapacity <= 0) { + throw new IllegalArgumentException("capacity too small"); + } + this.store = new Object[initialCapacity]; + } + + public T get(int index) { + if (index < 0) { + throw new IllegalArgumentException("index too small"); + } + if (index >= store.length) { + throw new IllegalArgumentException("index too large"); + } + + return (T) this.store[index]; + } + + public void set(int index, T val) { + if (index < 0) { + throw new IllegalArgumentException("index too small"); + } + if (index >= store.length) { + int factor = (int) Math.pow(2, Math.ceil(Math.log(index * 1.0 /store.length)/Math.log(2))); + Object[] nStore = new Object[store.length * factor]; + System.arraycopy(store, 0, nStore, 0, store.length); + this.store = nStore; + } + this.store[index] = val; + } + + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < store.length; i++) { + T val = (T) this.store[i]; + if (val == null) + { + sb.append(", "); + } else { + sb.append(val + ", "); + } + } + + sb.delete(sb.length()-2, sb.length()); + + return "[" + sb.toString() + "]"; + } + + public static void main(String[] arg) { + GrowableArray array = new GrowableArray<>(2); + array.set(0, "a"); + array.set(6, "b"); + array.set(9, "c"); + array.set(7, "x"); + System.out.println(array); + System.out.println(array.get(0)); + System.out.println(array.get(1)); + } + +} diff --git a/src/main/java/net/abhinavsarkar/algorist/LinkedList.java b/src/main/java/net/abhinavsarkar/algorist/LinkedList.java new file mode 100644 index 0000000..4c10ec0 --- /dev/null +++ b/src/main/java/net/abhinavsarkar/algorist/LinkedList.java @@ -0,0 +1,114 @@ +package net.abhinavsarkar.algorist; + +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; + +public class LinkedList +{ + private Node head; + + public LinkedList(Node head) + { + Objects.nonNull(head); + this.head = head; + } + + public static class Node + { + + private T value; + private Node next; + public Node(T value, Node next) + { + this.value = value; + this.next = next; + } + + } + + public T head() { + return head.value; + } + + public LinkedList tail() { + return head.next != null ? new LinkedList<>(head.next) : null; + } + + public void prepend(Node vNode) + { + vNode.next = head; + head = vNode; + } + + public Optional forEach(Function> f) { + LinkedList l = this; + LinkedList t; + + do { + t = l.tail(); + T h = l.head(); + Optional r = f.apply(h); + if (r.isPresent()) { + return r; + } + l = t; + } while (t != null); + return Optional.empty(); + } + + public void reverse() + { + Node curr = head; + + if (curr == null) + { + return; + } + + Node prev = null; + Node next = curr.next; + while (next != null) + { + curr.next = prev; + prev = curr; + curr = next; + next = curr.next; + } + + curr.next = prev; + head = curr; + } + + @Override + public String toString() + { + return "[" + toStringInternal(head) + "]"; + } + + private String toStringInternal(Node node) + { + if (node == null) + { + return ""; + } + else if (node.next == null) + { + return node.value.toString(); + } + else + { + return node.value + ", " + toStringInternal(node.next); + } + } + + public static void main(String[] args) + { + LinkedList integers = new LinkedList<>( + new LinkedList.Node<>(1, new LinkedList.Node<>(2, new LinkedList.Node<>(3, null)))); + System.out.println(integers); + + integers.reverse(); + System.out.println(integers); + } +}