哈希表及其应用分析

哈希表

什么是哈希表

首先,哈希表是一种数据结构,它通过某种映射函数 i n d e x = f ( k e y V a l u e ) index=f(keyValue) index=f(keyValue)将keyValue映射为某个可以直接访问的位置(索引),从而能加快在该数据结构中查询keyValue的速度。因此一个哈希表通常由数组+链表的结构组合而成,通过数组的索引能快速访问到keyValue存储在哪条链表中,然后再去遍历链表,便可以迅速找到这个keyValue,这样充分利用了数组能快速访问,链表能按需申请内存空间的双重优点,既满足速度的要求也满足内存的要求。
哈希表可以描述为:
在这里插入图片描述

哈希表的经典案例分析

需求描述
一个简单的员工管理系统,当有新的雇员来时,在系统中添加这个雇员信息(id,name,age,gender),要求不适用数据库系统,并能根据id快速查询到该雇员信息,且尽可能节省内存开销。
需求分析
不能使用数据库,要求查询速度快,且要节省内存,非哈希表莫属了。
图解
在这里插入图片描述
java代码解析

    //雇员节点
    public class Emp {
        public int id;
        public String name;
        public Emp next;
        public Emp(int id,String name){
            this.id=id;
            this.name=name;
        }
    }
    //雇员链表(不含头节点即head是要存储节点信息的)
    public class EmpLinkedList{
        private Emp head;
        //增减雇员节点
        public void add(Emp emp){
            if(head==null){
                //第一个节点
                head=emp;
                return;
            }
            //不是第一个节点,需要遍历到链表的最后,然后将emp添加进去
            Emp tmp=head;
            while(tmp.next!=null){
                tmp=tmp.next;
            }
            tmp.next=tmp;
        }
        //根据id查找emp的信息
        public Emp findEmpById(int id){
            if(head==null){
                System.out.println("当前链表为空无法查询!!");
            }
            Emp tmp=head;
            while(tmp.next!=null){
                if(tmp.id==id){
                    //找到了
                    return tmp;
                }
                tmp=tmp.next;
            }
            return null;
        }
    }

    /**
     * HashTable=数组+链表
     * */
    public class HashTable{
        private EmpLinkedList[] empLinkedListArray;//存放链表的数组
        private int size;//链表的条数
        public HashTable(int size){
            //必须要初始化数组中的每一条链表
            //所谓初始化new,就是在堆内存中开辟内存空间,并返回一个指向这个内存空间的引用。
            for(int i=0;i<size;i++){
                empLinkedListArray[i]=new EmpLinkedList()
            }
        }
        /**
         * 为该链表定义一个映射规则,关键字为:id
         * 
         * */
        private int hashFun(int id){
            return id%size;
        }

        //将雇员添加到哈希表中
        public void add(Emp emp){
            int EmpId=hashFun(emp.id);//找到哪条链表存储这条信息
            //向对应的链表添加雇员
            empLinkedListArray[EmpId].add(emp);
        }

        //根据Id查找相应的雇员信息
        public Emp findById(int id){
            int EmpLinkedListNo=hashFun(id);
            EmpLinkedList curEmpLinkedList=empLinkedListArray[EmpLinkedListNo];
            Emp emp=curEmpLinkedList.findEmpById(id);
            if(emp==null{
                System.out.println("雇员不存在");
            }
        }
        
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈希表(Hash Table),也称为散列表,是一种高效的数据结构,用于存储和查找键值对。它通过将键映射到一个固定大小的数组索引来实现快速的插入、删除和查找操作。 哈希表的核心思想是利用哈希函数将键转换为数组索引。哈希函数接收键作为输入,并生成一个对应的索引值。具有相同索引值的键值对会被存储在数组的同一个位置上,这个位置就是哈希表中的桶(bucket)。当需要查找特定键的值时,再次应用哈希函数即可快速定位到对应的桶,并返回值。 哈希表的主要优点是快速插入、删除和查找操作的时间复杂度通常为O(1)。然而,在某些情况下,由于哈希冲突(不同键对应相同索引),可能会导致性能下降。为了解决哈希冲突,常见的解决方法是使用链表或其他数据结构来处理冲突的元素,形成链地址法或开放地址法。 应用场景: - 缓存:哈希表常用于缓存系统中,可以通过将数据存储在内存中的哈希表中来加快访问速度。 - 数据索引:哈希表常用于构建索引,例如数据库中的索引,可以快速定位和检索数据。 - 字典:哈希表可以用于实现字典,其中键值对可以表示词汇和其对应的定义。 - 唯一性检查:哈希表可以用于检查元素的唯一性,例如在网站用户注册中检查用户名是否已存在。 - 分布式存储:哈希表在分布式系统中被广泛使用,用于数据的分片和路由。 总之,哈希表是一种高效的数据结构,适用于需要快速插入、删除和查找操作的场景。它在各种应用中都发挥着重要的作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值