📅  最后修改于: 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
,将其插入到 prev
和 curr
之间即可。如果 prev
为空,表示新节点应该插入到链表头,此时需要更新哈希表的对应槽位。
本题考查了哈希表以及链表的基本操作,特别是在哈希冲突下采用链地址法的实现。这是一道比较具有代表性的算法题,对于理解哈希表的基本原理、实现和应用都有很大的帮助。