📅  最后修改于: 2023-12-03 15:13:50.675000             🧑  作者: Mango
哈希表是一种能够提供快速插入、删除和查找操作的数据结构,通过将关键字映射到一个索引值上实现。在哈希表中,每个索引值对应着一个桶,桶中存储着一组键值对(key-value)。
在本文中,我们将介绍如何使用C#创建哈希表链表,这是一种使用链表来解决哈希冲突的方法。
我们首先需要创建一个Hashtable
类来表示哈希表。这个类有一个私有成员变量LinkedList<KeyValue>
,用于存储键值对。其中KeyValue
是一个存储键值对的结构体,定义如下:
struct KeyValue
{
public object Key;
public object Value;
public KeyValue(object key, object value)
{
this.Key = key;
this.Value = value;
}
}
接下来,我们需要实现哈希函数。哈希函数是将关键字映射到索引值的函数。在本例中,我们使用.NET提供的GetHashCode()
方法作为哈希函数。
private int GetHashCode(object key)
{
return key.GetHashCode();
}
接着,我们需要实现添加、删除和查找操作。这里我们使用链表来解决哈希冲突。当插入新的键值对时,我们首先计算出它的哈希值。然后将它插入到对应的桶的链表中。如果已经存在相同的键,则更新键对应的值。
public void Add(object key, object value)
{
int hash = GetHashCode(key);
LinkedList<KeyValue> bucket = GetBucket(hash);
foreach (KeyValue item in bucket)
{
if (item.Key.Equals(key))
{
item.Value = value;
return;
}
}
bucket.AddLast(new KeyValue(key, value));
}
在进行查找操作时,我们按照相同的方式计算出给定键的哈希值。然后在对应的桶中搜索对应键的键值对。如果找到了,则返回对应的值。
public object Get(object key)
{
int hash = GetHashCode(key);
LinkedList<KeyValue> bucket = GetBucket(hash);
foreach (KeyValue item in bucket)
{
if (item.Key.Equals(key))
{
return item.Value;
}
}
throw new KeyNotFoundException();
}
删除操作也是类似的。我们首先计算出给定键的哈希值,并搜索对应桶的链表以查找对应的键值对。如果找到了,则删除键值对。
public void Remove(object key)
{
int hash = GetHashCode(key);
LinkedList<KeyValue> bucket = GetBucket(hash);
foreach (KeyValue item in bucket)
{
if (item.Key.Equals(key))
{
bucket.Remove(item);
return;
}
}
throw new KeyNotFoundException();
}
最后,我们还需要写一个私有方法GetBucket()
,用于根据给定哈希值返回相应的桶。
private LinkedList<KeyValue> GetBucket(int hash)
{
int index = Math.Abs(hash % buckets.Length);
if (buckets[index] == null)
{
buckets[index] = new LinkedList<KeyValue>();
}
return buckets[index];
}
通过上述实现,我们已经完成了哈希表的创建。下面是一个使用示例:
Hashtable hashtable = new Hashtable();
hashtable.Add("key1", "value1");
hashtable.Add("key2", "value2");
Console.WriteLine(hashtable.Get("key1")); // Output: value1
hashtable.Remove("key1");
Console.WriteLine(hashtable.Get("key1")); // Throws KeyNotFoundException
通过本文的介绍,我们了解了如何使用链表来创建哈希表。虽然这种方法相对其他解决哈希冲突的方法(如开放地址法)来说效率可能不高,但是它简单易懂且容易实现。在一些简单的应用场景中,这种方法也是很实用的。