simo 2 hete
szülő
commit
efae43329f
1 módosított fájl, 128 hozzáadás és 0 törlés
  1. 128 0
      258/hashTableLab/Hashtable.java

+ 128 - 0
258/hashTableLab/Hashtable.java

@@ -0,0 +1,128 @@
+public class Hashtable<T> {
+
+    public static void main(String[] args) {
+        Hashtable<String> ht = new Hashtable<String>();
+        String s1 =
+            "The divine rights of kings was a political " +
+            "philosophy espoused by Chucky One back in the " +
+            "day who lost his head on account of him being " +
+            "a dumbass";
+        String[] words = s1.split(" ");
+        for (String s : words) ht.add(s);
+        ht.printArray();
+
+        int longestChain = ht.longestChain();
+
+        int numberOfChains = ht.numberOfChains();
+
+        // LINEAR PROBING :
+        // Longest Chain : 4
+        // Number of Chains : 3
+        //
+        // QUADRADIC PROBING :
+        // Longest Chain : 4
+        // Number of Chains : 2
+        //
+        // Less chains = quicker fetching
+
+        System.out.println(
+            "Longest Chain : " +
+                longestChain +
+                "\nNumber of Chains : " +
+                numberOfChains
+        );
+    }
+
+    private T[] table;
+    private int size;
+    private float loadFactor;
+
+    public Hashtable() {
+        this(11);
+    }
+
+    public Hashtable(int initialCapacity) {
+        table = (T[]) new Object[initialCapacity];
+        size = 0;
+        loadFactor = 0.75f;
+    }
+
+    public void add(T elem) {
+        if (size / (double) table.length > loadFactor) rehash();
+        int i = Math.abs(elem.hashCode()) % table.length;
+
+        int t = 0;
+        while (table[i] != null) {
+            // Linear Probing
+            // i = (i + 1) % table.length;
+            // Quadratic Probing
+            i = (i + (t ^ 2)) % table.length;
+            t++;
+        }
+        table[i] = elem;
+        size++;
+    }
+
+    public boolean contains(T elem) {
+        int i = Math.abs(elem.hashCode()) % table.length;
+        int t = 0;
+        while (table[i] != null && !table[i].equals(elem)) {
+            // Linear Probing
+            // i = (i + 1) % table.length;
+            // Quadratic
+            i = (i + (t ^ 2)) % table.length;
+        }
+        return table[i] != null;
+    }
+
+    public void printArray() {
+        for (int i = 0; i < table.length; i++) System.out.println(
+            i + ": " + table[i]
+        );
+    }
+
+    public int longestChain() {
+        int longest = 0;
+        for (int i = 0; i < table.length; i++) {
+            int j = i;
+
+            while (i < table.length && table[i] != null) {
+                i++;
+            }
+
+            int lengthOfChain = i - j;
+
+            if (lengthOfChain > longest) longest = lengthOfChain;
+        }
+
+        return longest;
+    }
+
+    public int numberOfChains() {
+        int threeOrMoreChains = 0;
+        for (int i = 0; i < table.length; i++) {
+            int j = i;
+            while (i < table.length && table[i] != null) {
+                i++;
+            }
+
+            int lengthOfChain = i - j;
+
+            if (lengthOfChain > 3) threeOrMoreChains++;
+        }
+
+        return threeOrMoreChains;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    private void rehash() {
+        T[] smallTable = table;
+        table = (T[]) new Object[table.length * 2 + 1];
+        for (int i = 0; i < smallTable.length; i++) if (
+            smallTable[i] != null
+        ) add(smallTable[i]);
+    }
+}