From c7714aebff9f336af199506b9400dbe70525d6a1 Mon Sep 17 00:00:00 2001 From: sergeynikitin Date: Thu, 22 Jul 2021 02:06:44 +0300 Subject: [PATCH 1/3] Create ChainingHashMap and LinearProbingHashMap --- .../ChainingHashMap.java | 97 +++++++++++++++++++ .../LinearProbingHashMap.java | 67 +++++++++++++ src/algorithmsAndDataStructures/Main.java | 14 ++- 3 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 src/algorithmsAndDataStructures/ChainingHashMap.java create mode 100644 src/algorithmsAndDataStructures/LinearProbingHashMap.java diff --git a/src/algorithmsAndDataStructures/ChainingHashMap.java b/src/algorithmsAndDataStructures/ChainingHashMap.java new file mode 100644 index 0000000..a8e96cd --- /dev/null +++ b/src/algorithmsAndDataStructures/ChainingHashMap.java @@ -0,0 +1,97 @@ +package algorithmsAndDataStructures; + + +import java.util.LinkedList; + +public class ChainingHashMap { + private int capacity; + private final int DEFAULT_CAPACITY = 16; + private int size; + private LinkedList[] st; + + public ChainingHashMap(int capacity) { + if (capacity <= 0) { + throw new IllegalArgumentException(); + } + this.capacity = capacity; + st = new LinkedList[capacity]; + for (int i = 0; i < capacity; i++) { + st[i] = new LinkedList<>(); + } + } + + public ChainingHashMap() { + this.capacity = DEFAULT_CAPACITY; + st = new LinkedList[capacity]; + for (int i = 0; i < capacity; i++) { + st[i] = new LinkedList<>(); + } + } + + private class Node { + K key; + V value; + + public Node(K key, V value) { + this.key = key; + this.value = value; + } + } + + public int size() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + private int hash(K key) { + return (key.hashCode() & 0x7fffffff) % capacity; + } + + public boolean contains(K key) { + return get(key) != null; + } + + private void checkKeyNotNull(K key) { + if (key == null) { + throw new IllegalArgumentException("key = null"); + } + } + + public void put(K key, V value) { + checkKeyNotNull(key); + int i = hash(key); + for (Node node : st[i]) { + if (key.equals(node.key)) { + node.value = value; + return; + } + } + st[i].addLast(new Node(key, value)); + size++; + } + + public V get(K key) { + checkKeyNotNull(key); + int i = hash(key); + for (Node node : st[i]) { + if (key.equals(node.key)) { + return node.value; + } + } + return null; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < capacity; i++) { + for (Node node : st[i]) { + sb.append("[" + node.key + "," + node.value + "] "); + } + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/algorithmsAndDataStructures/LinearProbingHashMap.java b/src/algorithmsAndDataStructures/LinearProbingHashMap.java new file mode 100644 index 0000000..4c03c63 --- /dev/null +++ b/src/algorithmsAndDataStructures/LinearProbingHashMap.java @@ -0,0 +1,67 @@ +package algorithmsAndDataStructures; + + +public class LinearProbingHashMap { + private int capacity; + private final int DEFAULT_CAPACITY = 17; + private int size; + private K[] keys; + private V[] values; + + public LinearProbingHashMap() { + this.capacity = DEFAULT_CAPACITY; + keys = (K[]) new Object[capacity]; + values = (V[]) new Object[capacity]; + } + + public int size() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + private int hash(K key) { + return (key.hashCode() & 0x7fffffff) % capacity; + } + + private int hash2(K key) { + return 7 - (key.hashCode() & 0x7fffffff) % 7; + } + + private void checkKeyNotNull(K key) { + if (key == null) { + throw new IllegalArgumentException("key = null"); + } + } + + public void put(K key, V value) { + checkKeyNotNull(key); + if (size >= capacity - 1) { + throw new RuntimeException("map is full"); + } + int i; + int step = hash2(key); + for (i = hash(key); keys[i] != null; i = (i + step) % capacity) { + if (key.equals(keys[i])) { + values[i] = value; + return; + } + } + keys[i] = key; + values[i] = value; + size++; + } + + public V get(K key) { + checkKeyNotNull(key); + int step = hash2(key); + for (int i = hash(key); keys[i] != null; i = (i + step) % capacity) { + if (key.equals(keys[i])) { + return values[i]; + } + } + return null; + } +} diff --git a/src/algorithmsAndDataStructures/Main.java b/src/algorithmsAndDataStructures/Main.java index ba454e2..5aa60a0 100644 --- a/src/algorithmsAndDataStructures/Main.java +++ b/src/algorithmsAndDataStructures/Main.java @@ -3,6 +3,18 @@ public class Main { public static void main(String[] args) { - // write your code here +// ChainingHashMap map=new ChainingHashMap<>(10); +// map.put(1,"one"); +// map.put(2,"two"); +// map.put(3,"three"); +// System.out.println(map.toString()); +// System.out.println(map.get(1)); + + LinearProbingHashMap map=new LinearProbingHashMap<>(); + map.put(1,"one"); + map.put(2,"two"); + map.put(3,"three"); + System.out.println(map.toString()); + System.out.println(map.get(1)); } } From 7f605bce521763a7718415ef0c60267cbb46081c Mon Sep 17 00:00:00 2001 From: sergeynikitin Date: Thu, 22 Jul 2021 12:18:34 +0300 Subject: [PATCH 2/3] Create ChainingHashMap and LinearProbingHashMap --- .../ChainingHashMap.java | 12 ++++++++ src/algorithmsAndDataStructures/Main.java | 29 ++++++++++++------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/algorithmsAndDataStructures/ChainingHashMap.java b/src/algorithmsAndDataStructures/ChainingHashMap.java index a8e96cd..e8a0bc6 100644 --- a/src/algorithmsAndDataStructures/ChainingHashMap.java +++ b/src/algorithmsAndDataStructures/ChainingHashMap.java @@ -84,6 +84,18 @@ public V get(K key) { return null; } + public void delete(K key) { + checkKeyNotNull(key); + int i = hash(key); + for (Node node : st[i]) { + if (key.equals(node.key)) { + st[i].remove(node); + size--; + return; + } + } + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/src/algorithmsAndDataStructures/Main.java b/src/algorithmsAndDataStructures/Main.java index 5aa60a0..80c49d8 100644 --- a/src/algorithmsAndDataStructures/Main.java +++ b/src/algorithmsAndDataStructures/Main.java @@ -3,18 +3,27 @@ public class Main { public static void main(String[] args) { -// ChainingHashMap map=new ChainingHashMap<>(10); -// map.put(1,"one"); -// map.put(2,"two"); -// map.put(3,"three"); -// System.out.println(map.toString()); -// System.out.println(map.get(1)); + doTask2(); - LinearProbingHashMap map=new LinearProbingHashMap<>(); - map.put(1,"one"); - map.put(2,"two"); - map.put(3,"three"); + } + + public static void doTask1() { + LinearProbingHashMap map = new LinearProbingHashMap<>(); + map.put(1, "one"); + map.put(2, "two"); + map.put(3, "three"); System.out.println(map.toString()); System.out.println(map.get(1)); } + + public static void doTask2() { + ChainingHashMap map = new ChainingHashMap<>(10); + map.put(1, "one"); + map.put(2, "two"); + map.put(3, "three"); + System.out.println(map.toString()); + System.out.println(map.get(1)); + map.delete(2); + System.out.println(map.toString()); + } } From f9d8e9fd692801a29d99bbe205f179ba5fe4bcf2 Mon Sep 17 00:00:00 2001 From: SerjNikitin <76908941+SerjNikitin@users.noreply.github.com> Date: Thu, 22 Jul 2021 12:22:00 +0300 Subject: [PATCH 3/3] Create README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..57304c2 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# AlgorithmsAndDataStructures +Create ChainingHashMap and LinearProbingHashMap