哈希表及其應用分析

哈希表

什麼是哈希表

首先,哈希表是一種數據結構,它經過某種映射函數\(index=f(keyValue)\)將keyValue映射爲某個能夠直接訪問的位置(索引),從而能加快在該數據結構中查詢keyValue的速度。所以一個哈希表一般由數組+鏈表的結構組合而成,經過數組的索引能快速訪問到keyValue存儲在哪條鏈表中,而後再去遍歷鏈表,即可以迅速找到這個keyValue,這樣充分利用了數組能快速訪問,鏈表能按需申請內存空間的雙重優勢,既知足速度的要求也知足內存的要求。
哈希表能夠描述爲:
在這裏插入圖片描述java

哈希表的經典案例分析

需求描述
一個簡單的員工管理系統,當有新的僱員來時,在系統中添加這個僱員信息(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("僱員不存在");
            }
        }
        
    }
相關文章
相關標籤/搜索