🪐🪐🪐欢迎来到程序员餐厅💫💫💫
主厨:邪王真眼
主厨的主页:Chef‘s blog
所属专栏:c++大冒险
总有光环在陨落,总有新星在闪烁
引言:
我们之前学习了红黑树及其应用,它增删查改的时间复杂度仅仅只有log N,然而,今天我们会学习的哈希直接把增删查改的时间复杂度降低到了O(1)!心动了对吧?那就快来学习吧。
一、哈希概念
顺序结构以及平衡树中,元素关键码(Key)与其存储位置之间
没有对应的关系
,因此在查找一个元素时,
必须要经过关键码的多次比较。
顺序查找时间复杂度为O(N),平衡树中为O(log N)。
理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。
构造一种存储结构,通
过某种函数使元素的存储位置与它的关键码能够建立一一映射的关系
,那么在查找时通过该函数可以很快找到该元素。该方式即为
哈希(散列)方法,
构造出来的结构称
为
哈希表(Hash Table
),或称散列表。
例如:
对于数据集合{1,7,6,4,5,9};
哈希函数设置为:hash(key) = key % capacity; capacity为存储元素底层空间总的大小
二、 哈希函数
哈希方法中使用的转换函数称为哈希(散列)函数
哈希函数设计原则:
- 哈希函数的定义域必须包括需要存储的全部关键码,而如果散列表允许有m个地址时,其值域必须在0到m-1之间
- 哈希函数计算出来的地址能均匀分布在整个空间中
- 哈希函数应该比较简单
常见哈希函数
2.1 直接定址法--(常用)
Hash(Key)= A*Key + B
- 优点:简单、均匀
- 缺点:需要事先知道关键字的分布情况
- 使用场景:适合查找比较小且连续的情况
2.2. 除留余数法--(常用)
设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,