📜  门| GATE-CS-2007 |第 59 题(1)

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

题目介绍

本题为 GATE-CS-2007 的第 59 题,内容为关于哈希表的实现和操作。

题目描述

给定一个哈希表,哈希表采用链地址法解决哈希冲突问题,每个元素被哈希到的链表都按升序排列。现在需要插入一个新元素,并保证插入后链表仍然有序。

请编写一个函数,函数名为 insertSorted(),具体参数和返回值请参考代码片段。

代码片段

def insertSorted(hashtable, key, value):
    """
    Insert the key-value pair (key, value) into the given hashtable.
    The hashtable uses chaining to resolve collisions, and each chain is sorted in ascending order.

    Args:
    hashtable: a list of linked lists, representing the hashtable
    key: the key of the element to be inserted
    value: the value of the element to be inserted

    Returns:
    The updated hashtable after the new element has been inserted.
    """

    # Find the index of the slot the key should hash to
    slot = hash(key) % len(hashtable)

    # Find the correct location to insert the new element in the chain at that slot
    # (Assuming the chain is sorted in ascending order)
    prev = None
    curr = hashtable[slot]
    while curr and curr.key < key:
        prev = curr
        curr = curr.next

    # Create a new node to hold the new element
    new_node = Node(key, value)

    # Insert the new node into the chain, either at the beginning, end, or middle
    if prev:
        new_node.next = prev.next
        prev.next = new_node
    else:
        new_node.next = hashtable[slot]
        hashtable[slot] = new_node

    return hashtable

思路解析

本题考查了哈希表的基本操作,特别是解决哈希冲突的方法,链地址法。

根据哈希函数和哈希表大小,可以计算出一个 key 哈希后应该落在哈希表的哪个槽位(索引)。然而,由于哈希函数是一种随机映射关系,而且哈希表的槽位数是有限的,因此不可避免地会出现多个元素哈希到同一个槽位的情况,即哈希冲突。

为了解决哈希冲突,链地址法采用了一种高效的方法:将每个槽位都设为一个链表。如果多个元素哈希到同一个槽位,那么它们都会被插入到这个链表中。为了方便查询,每个链表都是按照键的升序排列的。

那么,对于本题,我们需要实现一个插入操作,将一个新元素按照升序插入到对应的链表中。具体做法是,从链表头开始遍历,找到第一个键大于等于新键的节点 curr,同时记录下其前驱节点 prev。然后,创建一个新节点 new_node,将其插入到 prevcurr 之间即可。如果 prev 为空,表示新节点应该插入到链表头,此时需要更新哈希表的对应槽位。

小结

本题考查了哈希表以及链表的基本操作,特别是在哈希冲突下采用链地址法的实现。这是一道比较具有代表性的算法题,对于理解哈希表的基本原理、实现和应用都有很大的帮助。