数组和链表都被直接映射到内存,但散列表更复杂,它使用散列函数来确定元素的存储位置。在你将学习的复杂数据结构中,散列表可能是最有用的,也被称为散列映射、映射、字典和关联数组。
散列表的速度很快。你可以立即获取数组中的元素,而散列表也使用数组来存储数据,因此其获取元素的速度与数组一样快。
你可能根本不需要自己去实现散列表,任一优秀的语言都提供了散列表实现。Python提供的散列表实现为字典,你可使用函数dict来创建散列表。
总结一下,散列表适合用于:
- 模拟映射关系;
- 防止重复;
- 缓存/记住数据,以免服务器再通过处理来生成它们。
冲突:两个键映射到同一个位置。
最简单的办法如下:如果两个键映射到了同一个位置,就在这个位置存储一个链表。但是当要存储的键都是以a开头,那么会导致只有一个位置上有值,且这个链表会很长,散列表的速度回很慢。
引出:
- 散列函数很重要。前面的散列函数将所有的键都映射到一个位置,而最理想的情况是,散列函数将键均匀地映射到散列表的不同位置。
- 如果散列表存储的链表很长,散列表的速度将急剧下降。然而,如果使用的散列函数很好,这些链表就不会很长!
性能:需要避免冲突。
方法:较低的填装因子;良好的散列函数。(一旦填装因子超过0.7,就该调整散列表的长度。)