I realize C# and .NET in general already has the Hashtable and Dictionary classes.
Can anyone demonstrate in C# an implementation of a Hashtable?
Update: To clarify, I'm not ncessarily looking for a complete implementation, just an example of the core features of a hashtable (i.e. add,remove, find by key).
Hash Table is a data structure which stores data in an associative manner. In a hash table, data is stored in an array format, where each data value has its own unique index value. Access of data becomes very fast if we know the index of the desired data.
Take an array and use the hash function to hash the 26 possible characters with indices of the array. Then iterate over S and increase the value of the current character of the string with the corresponding index for each character. The complexity of this hashing approach is O(N), where N is the size of the string.
Advertisements. Hash Table is a data structure which stores data in an associative manner. In hash table, the data is stored in an array format where each data value has its own unique index value. Access of data becomes very fast, if we know the index of the desired data.
Long after the question has been asked, so I don't expect to earn much rep. However I decided it would be fun to write my own very basic example (in less than 90 lines of code):
public struct KeyValue<K, V> { public K Key { get; set; } public V Value { get; set; } } public class FixedSizeGenericHashTable<K,V> { private readonly int size; private readonly LinkedList<KeyValue<K,V>>[] items; public FixedSizeGenericHashTable(int size) { this.size = size; items = new LinkedList<KeyValue<K,V>>[size]; } protected int GetArrayPosition(K key) { int position = key.GetHashCode() % size; return Math.Abs(position); } public V Find(K key) { int position = GetArrayPosition(key); LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position); foreach (KeyValue<K,V> item in linkedList) { if (item.Key.Equals(key)) { return item.Value; } } return default(V); } public void Add(K key, V value) { int position = GetArrayPosition(key); LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position); KeyValue<K, V> item = new KeyValue<K, V>() { Key = key, Value = value }; linkedList.AddLast(item); } public void Remove(K key) { int position = GetArrayPosition(key); LinkedList<KeyValue<K, V>> linkedList = GetLinkedList(position); bool itemFound = false; KeyValue<K, V> foundItem = default(KeyValue<K, V>); foreach (KeyValue<K,V> item in linkedList) { if (item.Key.Equals(key)) { itemFound = true; foundItem = item; } } if (itemFound) { linkedList.Remove(foundItem); } } protected LinkedList<KeyValue<K, V>> GetLinkedList(int position) { LinkedList<KeyValue<K, V>> linkedList = items[position]; if (linkedList == null) { linkedList = new LinkedList<KeyValue<K, V>>(); items[position] = linkedList; } return linkedList; } }
Here's a little test application:
static void Main(string[] args) { FixedSizeGenericHashTable<string, string> hash = new FixedSizeGenericHashTable<string, string>(20); hash.Add("1", "item 1"); hash.Add("2", "item 2"); hash.Add("dsfdsdsd", "sadsadsadsad"); string one = hash.Find("1"); string two = hash.Find("2"); string dsfdsdsd = hash.Find("dsfdsdsd"); hash.Remove("1"); Console.ReadLine(); }
It's not the best implementation, but it works for Add, Remove and Find. It uses chaining and a simple modulo algorithm to find the appropriate bucket.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With