哈希表简介

本文介绍了哈希表的概念,通过例题阐述哈希函数的作用,并讨论了哈希冲突及其解决方法,重点讲解了基于开散列的哈希表实现,包括添加、扩容、查找和删除操作。此外,还探讨了负载因子在哈希表中的作用。
摘要由CSDN通过智能技术生成

目录

一、哈希表的引出

1、例题

2、哈希表以及哈希函数

3、哈希冲突 

二、基于开散列方式实现的哈希表 

1、哈希表的基本内容

2、哈希表的添加操作

3、哈希表的扩容操作

 4、哈希表的查找操作

 5、哈希表的删除操作

三、相关代码


一、哈希表的引出

1、例题

字符串中第一个唯一的字符

第一种思路,使用Map集合:

 先将字符串转换为字符数组,在Map<Character,Integer>集合中保存字符以及字符出现的次数,遍历Map集合取出次数为1所对应的key值,再次遍历字符串,找到对应的索引就解决了

public int firstUniqChar(String s) {
          char[] data=s.toCharArray();
        Map<Character,Integer> map=new HashMap<>();
        for (char i:data){
            map.put(i,map.getOrDefault(i,0)+1);
        }
        for (int i = 0; i < data.length; i++) {
            if (map.get(data[i]) == 1) {
                return i;
            }
        }
        return -1;
    }

将每个字符出现的次数保存到整型数组中,最后找到次数为1的字符即可

public int firstUniqChar(String s) {
          //由于s中只包含小写字母,因此就将每个字符出现的频次保存到整型数组中
        int[] arr=new int[26];
        //遍历字符串,将字符出现的频次保存到arr数组中
        for (int i = 0; i <s.length() ; i++) {
            char c=s.charAt(i);
            //按照-‘a’的规则将每一个小写字母转换为26个数字中的一个
            //'c'-'a'=2   'a'-'a'=0
            arr[c-'a']++;
        }
        //遍历字符串,在arr数组中找到出现次数唯一的字符
        int retindex=-1;
        for (int i = 0; i < s.length(); i++) {
            char c=s.charAt(i);
            if (arr[c-'a']==1){
                retindex=i;
                break;
            }
        }
        return retindex;
    }

2、哈希表以及哈希函数

上述例题中的第二种方法的arr数组就是一个哈希表,每一个不重复的字符都和一个整型数字一一对应,按照规则(字符-‘a’)将每个字符转换为数字,这个转换操作就叫做哈希函数。

哈希表中需要一种方法将任意数据类型转换为数组的索引,这样的一种方法就称为哈希函数

哈希表就是基于数组的扩展,在数组中如果知道索引,就可以在O(1)的时间复杂度内找到该元素,哈希表体现了空间去换取时间的策略方法

例题:

在数组[9,5,2,7,3,6,8]中查找元素是否存在?

就建立一个长度为10的arr数组,遍历原数组,若元素存在就在arr数组对应的位置添加true

int[] arr=new int[10];

arr[9]=true;

arr[5]=true;

.........直到扫描完整个集合

此时要查询7是否存在,就判断arr[7]的值是否为true

在上述例题中,我们开辟了原数组最大值+1的新的哈希数组,但是当原数组的数字之间的跨度非常大时,或者包含负数,这种方法就不适用了,比如[9,100000,-34,30000000,44]这个数组来说,就没法创造一个数字一一对应的索引的哈希数组了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值