我们的字典的核心功能由几种基本方法提供

Discuss smarter ways to manage and optimize cv data.
Post Reply
jrineakter
Posts: 406
Joined: Thu Jan 02, 2025 7:18 am

我们的字典的核心功能由几种基本方法提供

Post by jrineakter »

set(key, value) 方法允许您添加或更新键值对。它首先检查输入参数的有效性,并将键转换为其字符串表示形式。然后将该值存储在内部存储器中,并更新大小计数器。

get(key) 方法用于检索值。它还使用键的字符串转换并返回相应的值(如果可用)。 hasKey(key) 方法通过检查键的存在来扩展此功能。

remove(key) 方法用于删除条目。它使用转换后的密钥定位条目并将其从内部存储中删除。 clear() 方法更进一步,立即删除所有条目。

为了使使用字典更容易,我们提供了额外的辅助方法:keys() 返回所有键的数组,values() 返回所有存储的值,forEach 方法允许使用回调函数迭代所有条目。

一个实际的例子说明了我们的字典的用途:

哈希表是字典概念的高级实现,通过使用哈希 乌拉圭 WhatsApp 数据 函数可以实现更高效的数据存储和更快的访问。哈希表本质上也是键值对的集合,但是内部存储组织方式有关键的区别。

哈希表背后的基本思想非常有趣:不是直接将值与其键一起存储,而是使用哈希函数将每个键转换为数值 - 即所谓的哈希码。然后,该哈希码确定作为存储结构的数组中值的位置。您可以将其想象为一个复杂的归档系统,其中哈希函数充当一种自动排序助手。

哈希表的实现始于定义合适的哈希函数。一种简单但经常使用的变体是“lose-lose”哈希函数,它将密钥字符的 ASCII 值相加:


该哈希函数将每个键转换为一个数字,用作内部数组中的索引。最后的模运算确保结果索引在数组边界内。然而,这种简化也带来了挑战:不同的键可能会产生相同的哈希码——这种现象称为碰撞。

处理冲突是实现哈希表最关键的方面之一。有不同的策略来解决这个问题。最著名的两种是“单独链接”和“线性探测”。

单独的链接方法在数组中的每个位置存储一个链表,该链表可以包含多个条目。如果发生冲突,则新条目将简单地附加到现有列表中。这种方法特别优雅,因为它对碰撞次数没有限制:


线性探测采用不同的方法:当发生碰撞时,将搜索数组中的下一个空闲索引。这是通过逐步计数直到找到空闲位置来完成的。这种方法节省内存,但如果发生多次碰撞,可能会导致性能损失。

通过改进哈希函数优化哈希表
哈希表的效率很大程度上取决于其哈希函数的质量。到目前为止考虑的“双输”哈希函数很容易实现,但在实践中往往不是最优的,因为它经常导致冲突。一个更高级的替代方案是 djb2 哈希函数,它因其在简单性和有效性之间的良好平衡而受到开发者社区的赞赏。

djb2 哈希函数采用复杂的数学公式,可以产生更好的哈希值分布:

当我们观察哈希值的分布时,与简单哈希函数的差异变得尤为明显。我们以地址簿用例为例:

使用双输哈希函数,名称“Jamie”和“Sue”可能会产生相同的哈希值 5,从而导致冲突。另一方面,djb2 函数可能会为“Jamie”生成值 962,为“Sue”生成值 502 - 这是一个更好的分布,可以最大限度地减少冲突。

选择正确的哈希函数对哈希表的性能有直接的影响。一个好的哈希函数应该具有以下性质:

确定性:相同的输入必然产生相同的哈希值
均匀分布:哈希值应尽可能均匀地分布在可用值范围内
效率:哈希值的计算应该很快
抗碰撞性:不同的输入很少会导致相同的哈希值
实践证明,即使使用优化的哈希函数,也无法完全避免冲突。因此,优化碰撞处理也很重要。这里的一个重要因素是哈希表的负载因子,它表示存储元素与表的总大小之间的比率。负载系数过高会导致碰撞增加并降低性能。
Post Reply