zoukankan      html  css  js  c++  java
  • 数据结构与算法-java-哈希表

    什么是哈希表

    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表
    给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

    其实可以这样理解,哈希表就像一个缓冲层

     下面来看一个案例

     大致可以分析如下

    package hashTable;
    
    import java.util.Scanner;
    
    //表示一个雇员
    class Emp{
        public int id;
        public String name;
        public Emp next;
    
        public Emp(int id, String name) {
            this.id = id;
            this.name = name;
        }
    }
    
    //表示链表
    class EmpLinkedList{
        private  Emp head; //默认为null
        //add
        public void add(Emp emp)
        {
            //如果是添加第一个
            if(head ==null)
            {
                head=emp;
                return;
            }
            //不是第一个
            Emp temp = head;
            while (true)
            {
                if(temp.next==null)
                {
                    //说明到最后了
                    break;
                }
                temp=temp.next; //后移
            }
            //while退出时一定为最后,指向加入链表就行了
            temp.next=emp;
        }
        public void show(){
            if(head==null)
            {
                System.out.println("当前链表为空");
                return;
            }
            System.out.println("当前链表信息为");
            Emp temp=head;
            while (true)
            {
                System.out.printf("=>id=%d name=%s  	",temp.id,temp.name);
                if (temp.next == null) {
    
                    break;
                }
                temp=temp.next;//后移即++
            }
            System.out.println();//换行
        }
    
    }
    //创建hash表,管理多条链表,如图那样
    class HashTab{
        private EmpLinkedList [] empLinkedListArray;
        private int size;
    
        //构造器
        public HashTab(int size)
        {
            this.size=size;
            empLinkedListArray = new EmpLinkedList[size];
            for(int i=0;i<size;i++)
            {
                empLinkedListArray[i]=new EmpLinkedList();
            }
        }
        //添加员工
        public void  add(Emp emp)
        {
            int empNo=hashFunc(emp.id);
            empLinkedListArray[empNo].add(emp);
        }
        public void show(){
            for (int i=0;i<size;i++)
            {
                empLinkedListArray[i].show();
            }
        }
        public int hashFunc(int id)
        {
            return id%size;  //通过模判断在hash表的位置
        }
    }
    
    
    public class hashTableDemo {
        public static void main(String[] args) {
            HashTab hashTab = new HashTab(7);
            String key="";
            Scanner scanner =new  Scanner(System.in);
            while (true) {
                System.out.println("add:添加雇员");
                System.out.println("show:显示雇员");
                System.out.println("exit:退出");
                key = scanner.next();
                switch (key)
                {
                    case "add":
                        System.out.println("输入id");
                        int id = scanner.nextInt();
                        System.out.println("输入名字");
                        String  name = scanner.next();
                        Emp emp = new Emp(id,name);
                        hashTab.add(emp);
                        break;
                    case "show":
                        hashTab.show();
                        break;
                    case "exit":
                        scanner.close();
                        break;
                    default:
                        break;
                }
    
            }
        }
    }

     

  • 相关阅读:
    Spring事务原理一探
    浅谈AI视频技术超分辨率
    网易云信独家技术支持,壹点灵领跑心理服务行业
    音视频技术“塔尖”之争,网易云信如何C位出道?
    浅析为何使用融合CDN是大趋势?
    谈谈接入各种第三方推送平台的技术方案和一点经验
    编解码器之战:AV1、HEVC、VP9和VVC
    三年深入探索,网易云信让在线医疗做到技术“在线”
    5分钟学会Java9-Java11的七大新特性
    网易云信案例简析:锤科情怀缩影,子弹短信路在何方?
  • 原文地址:https://www.cnblogs.com/yangj-Blog/p/12967869.html
Copyright © 2011-2022 走看看