Hash表
题目
有十个自然数, 自然数的取值范围为0 - 100 用最快的速度判断, 用最快的速度判断某个数是否在这十个数之中
解题思路
可以创建一个大小为100的数组, 遍历这十个数, 将这十个数当作创建的数组下标存储到数组中, 然后将数组的值设置为1. 当想要进行查询某个值时, 直接将该值以下标的方式进行访问数组即可, 若返回为0表示不存在, 若返回为1表示存在. 时间复杂度为O(1).
这个可以很好的对hash table的思想进行表示, 通过 将这十个数当作创建的数组下标存储到数组中的方式生成一个唯一的key, 当进行检索数字时, 直接使用该key以下标的方式进行访问数组即可.
如下所示
首先6个数字分别是2, 4, 6, 78, 21, 4, 我们想要判断78元素是否存在
首先创建个hash函数用于将唯一key的方式进行关联到数组中
public static void creatHash(int[] a, Integer key) {
a[key] = 1;
}
然后遍历数组进行生成唯一key
int[] a = {2, 4, 6, 78, 21, 4};
int[] b = new int[100];
for (int i = 0; i < a.length; i++) {
Hash.creatHash(b, a[i]);
}
hash表的初始结构如下所示
首先进入要为二号元素生成一个唯一key 指教将下标为2的数组的值设置为1即可
之后是四号元素, 依次类推
当进行访问时, 直接按数组下标进行访问即可, 如76号元素.
不足
不足之处在于数组的大小不是无限大的, 如果范围为10000000的话, 并不可能浪费空间创建这么大的数组,
这时候可以以表长取余整数的值来进行hash计算
如523号元素和23号元素
523 % 100 = 23
23 % 100 = 23
这样就造成了hash冲突
虽然道路是曲折的,但前途是光明的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律