• 哈希表及其应用分析


    哈希表

    什么是哈希表

    首先,哈希表是一种数据结构,它通过某种映射函数(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("雇员不存在");
                }
            }
            
        }
    
  • 相关阅读:
    [转载]Install Opera 12.16 Web Browser in CentOS/RHEL and Fedora
    [转载]CentOS 6.5 安装五笔输入法
    [转载]Lenovo E431 装Centos7无线驱动安装
    ElasticSearch的按日期排序问题
    [转载]java自带线程池和队列详细讲解
    [转载]Redis后台启动
    [转载]Process工具类,提供设置timeout功能
    [转载]使用java.lang.Process类的简单例子
    [转载]SecureCRT 绝佳配色方案, 保护你的眼睛
    4.二叉搜索树转为有序双向链表(递归算法与非递归算法)
  • 原文地址:https://www.cnblogs.com/Thinker-Bob/p/13046500.html
Copyright © 2020-2023  润新知