哈希表及其应用分析

哈希表

什么是哈希表

首先,哈希表是一种数据结构,它通过某种映射函数\(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("雇员不存在");
            }
        }
        
    }

posted on 2020-06-04 21:01  小毅哥哥Bob  阅读(398)  评论(0编辑  收藏  举报

导航