📜  C# 创建哈希表链表 - C# (1)

📅  最后修改于: 2023-12-03 15:13:50.675000             🧑  作者: Mango

使用C#创建哈希表链表

哈希表是一种能够提供快速插入、删除和查找操作的数据结构,通过将关键字映射到一个索引值上实现。在哈希表中,每个索引值对应着一个桶,桶中存储着一组键值对(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
结论

通过本文的介绍,我们了解了如何使用链表来创建哈希表。虽然这种方法相对其他解决哈希冲突的方法(如开放地址法)来说效率可能不高,但是它简单易懂且容易实现。在一些简单的应用场景中,这种方法也是很实用的。