Adds loadFactor in OAHT
This commit is contained in:
parent
4973ae6b73
commit
cf8d64192d
|
@ -0,0 +1,5 @@
|
||||||
|
package net.abhinavsarkar.algorist;
|
||||||
|
|
||||||
|
public class BinarySearchTree
|
||||||
|
{
|
||||||
|
}
|
|
@ -9,19 +9,35 @@ public class OpenAddressingHashTable<K, V> implements Iterable<OpenAddressingHas
|
||||||
|
|
||||||
private static final Entry REMOVED = new Entry(0,0);
|
private static final Entry REMOVED = new Entry(0,0);
|
||||||
private Object[] store;
|
private Object[] store;
|
||||||
|
private final double loadFactor;
|
||||||
private final ProbingStrategy probingStrategy;
|
private final ProbingStrategy probingStrategy;
|
||||||
private Entry<K, V> head;
|
private Entry<K, V> head;
|
||||||
private Entry<K, V> tail;
|
private Entry<K, V> tail;
|
||||||
private int size;
|
private int size;
|
||||||
|
private int actualSize;
|
||||||
|
|
||||||
public OpenAddressingHashTable(int initialCapacity, ProbingStrategy probingStrategy) {
|
public OpenAddressingHashTable(int initialCapacity, double loadFactor, ProbingStrategy probingStrategy) {
|
||||||
this.store = new Object[initialCapacity];
|
this.store = new Object[nextPowerOf2(initialCapacity)];
|
||||||
|
this.loadFactor = loadFactor;
|
||||||
this.probingStrategy = probingStrategy;
|
this.probingStrategy = probingStrategy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OpenAddressingHashTable(int initialCapacity)
|
public OpenAddressingHashTable(int initialCapacity, double loadFactor)
|
||||||
{
|
{
|
||||||
this(initialCapacity, new LinearProbing());
|
this(initialCapacity, loadFactor, new LinearProbing());
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAddressingHashTable(int initialCapacity) {
|
||||||
|
this(initialCapacity, 0.75);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenAddressingHashTable() {
|
||||||
|
this(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int nextPowerOf2(int num)
|
||||||
|
{
|
||||||
|
return num == 1 ? 1 : Integer.highestOneBit(num - 1) * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<V> get(K key) {
|
public Optional<V> get(K key) {
|
||||||
|
@ -53,25 +69,23 @@ public class OpenAddressingHashTable<K, V> implements Iterable<OpenAddressingHas
|
||||||
}
|
}
|
||||||
|
|
||||||
public void put(K key, V val) {
|
public void put(K key, V val) {
|
||||||
if (!doPut(new Entry<>(key, val), store, false)) {
|
if (actualSize >= loadFactor * store.length) {
|
||||||
resize();
|
resize();
|
||||||
put(key, val);
|
|
||||||
}
|
}
|
||||||
|
doPut(new Entry<>(key, val), store, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resize() {
|
private void resize() {
|
||||||
Object[] nStore = new Object[store.length * 2];
|
Object[] nStore = new Object[store.length * 2];
|
||||||
for (Entry<K, V> entry : this)
|
for (Entry<K, V> entry : this)
|
||||||
{
|
{
|
||||||
if (!doPut(entry, nStore, true))
|
doPut(entry, nStore, true);
|
||||||
{
|
|
||||||
throw new IllegalStateException("Something is wrong");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this.store = nStore;
|
store = nStore;
|
||||||
|
actualSize = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean doPut(Entry<K,V> nEntry, Object[] store, boolean resize) {
|
private void doPut(Entry<K,V> nEntry, Object[] store, boolean resize) {
|
||||||
int trial = 0;
|
int trial = 0;
|
||||||
int baseIndex = calcIndex(nEntry.key, store.length);
|
int baseIndex = calcIndex(nEntry.key, store.length);
|
||||||
while (trial < store.length) {
|
while (trial < store.length) {
|
||||||
|
@ -83,10 +97,13 @@ public class OpenAddressingHashTable<K, V> implements Iterable<OpenAddressingHas
|
||||||
{
|
{
|
||||||
linkNewEntry(nEntry);
|
linkNewEntry(nEntry);
|
||||||
size++;
|
size++;
|
||||||
|
if (entry != REMOVED) {
|
||||||
|
actualSize++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
store[index] = nEntry;
|
store[index] = nEntry;
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
else if (entry.key.equals(nEntry.key))
|
else if (entry.key.equals(nEntry.key))
|
||||||
{
|
{
|
||||||
|
@ -94,11 +111,11 @@ public class OpenAddressingHashTable<K, V> implements Iterable<OpenAddressingHas
|
||||||
linkUpdatedEntry(entry);
|
linkUpdatedEntry(entry);
|
||||||
}
|
}
|
||||||
entry.val = nEntry.val;
|
entry.val = nEntry.val;
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
trial++;
|
trial++;
|
||||||
}
|
}
|
||||||
return false;
|
throw new IllegalStateException("Impossible");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void linkNewEntry(Entry<K, V> nEntry)
|
private void linkNewEntry(Entry<K, V> nEntry)
|
||||||
|
@ -278,11 +295,15 @@ public class OpenAddressingHashTable<K, V> implements Iterable<OpenAddressingHas
|
||||||
public static void main(String[] args)
|
public static void main(String[] args)
|
||||||
{
|
{
|
||||||
OpenAddressingHashTable<String, String> table =
|
OpenAddressingHashTable<String, String> table =
|
||||||
new OpenAddressingHashTable<>(4, new LinearProbing());
|
new OpenAddressingHashTable<>(2, 0.75, new LinearProbing());
|
||||||
table.put("a", "abhinav");
|
table.put("a", "abhinav");
|
||||||
table.put("b", "batman");
|
table.put("b", "batman");
|
||||||
table.put("c", "carol");
|
table.put("c", "carol");
|
||||||
table.put("c", "carly");
|
table.put("c", "carly");
|
||||||
|
|
||||||
|
table.remove("a");
|
||||||
|
System.out.println(table.size());
|
||||||
|
|
||||||
table.put("z", "zellman");
|
table.put("z", "zellman");
|
||||||
table.put("w", "walker");
|
table.put("w", "walker");
|
||||||
System.out.println(table);
|
System.out.println(table);
|
||||||
|
|
Loading…
Reference in New Issue