- 2022tysc0306 的博客
哈希表 (hash)
- 2024-5-25 9:42:51 @
哈希表
一、哈希表
哈希的应用主要分成两类:一类是哈希表,用于查找;另一类是字符串哈希,用于匹配。
- 顺序查找,这个方式的时间复杂度为 。如果序列是有序的,借助二分查找,能达到 的效率。但若序列是无序的,又遇到稍大的数据量如 ,将面临时间超限的问题。
- 桶排。输入x后做出标记,a[x]=x。查找即是对a[x]的值进行判断,如等于x则存在,时间复杂度为 。该处理方式虽然快但涉及到空间问题,若序列中的数值相对较稀疏时,空间的开销会较大。 如面临大数据量的查找时,我们能将这两种方式的有点相结合,综合时空优势,无疑是一个有效的解决 途径。而哈希表,便是处于这两种方式的中间点,平衡时空问题,有效进行查找。
- 构造哈希函数有三个注意的要点:
- 1、构造哈希函数有两个标准:简单和均匀。
- 2、哈希函数的关键字一般要选用元素中的整数或字符串。
- 3、最常用的哈希函数:
除留余数法
,即 。其中 必须为素数, 可以使得元素在数据结构中均匀分布,减少冲突。
二、容器
- 函数:
函数名 | 操作功能 | 调用方式 |
---|---|---|
begin() | 获取vector中首元素的地址,即g[0]的地址 | g.begin() |
end() | 获取vector中尾元素的下一地址(空) | g.end() |
size() | 调用size()函数可以获得vector中保存的元素个数 | g.size() |
push_back(x) | 在vector的最后面添加一个元素x | g.push_back(x) |
pop_back() | 删除vector的末尾元素 | g.pop_back() |
clear() | 用于清空vector中所有的元素 | g.clear() |
- 元素的插入:
inline void insert(int x)
{
h[has(x)].push_back(x);
}
- 元素查找:
inline bool find(int x)
{
for(int i = 0; i < h[has(x)].size(); i++){
if(h[has(x)][i] == x)return true;
}
return false;
}
三、
是 标准库中提供的一个关联容器,可以实现元素一对一的映射
想要调用 则必须引用头文件<map>
- 如下:
#include <map>
- 或万能头:
#include <bits/stdc++.h>
- 底层:
是使用 红黑树
来实现的,
因此 中的元素默认按照键的 升序 进行排序。