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表的初始结构如下所示
image
首先进入要为二号元素生成一个唯一key 指教将下标为2的数组的值设置为1即可
image

之后是四号元素, 依次类推
image
当进行访问时, 直接按数组下标进行访问即可, 如76号元素.

不足

不足之处在于数组的大小不是无限大的, 如果范围为10000000的话, 并不可能浪费空间创建这么大的数组,
这时候可以以表长取余整数的值来进行hash计算
如523号元素和23号元素
523 % 100 = 23
23 % 100 = 23
这样就造成了hash冲突

posted @   RainbowMagic  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示