哈希表
Google上机题
1)看一个实际需求,google公司的一个上机题:
2)有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该员工的id时,要求查找到该员工的所有信息.
3)要求:不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)
基本介绍
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
分析
添加时,保证按照id从低到高插入
使用链表来实现哈希表,该链表不带表头[即:链表的第一个结点就存放雇员信息]
代码
package com.sgg.datastructure.hashtable;public 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) {//根据员工的 id ,得到该员工应当添加到哪条链表int empLinkedListNO = hashFun(emp.id);//将 emp 添加到对应的链表中empLinkedListArray[empLinkedListNO].add(emp);}public void list() {for (int i = 0; i < size; i++) {System.out.println("开始打印"+(1+i));empLinkedListArray[i].list();}}public void findEmpById(int id) {//使用散列函数确定到哪条链表查找int empLinkedListNO = hashFun(id);Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id);if(emp != null) {//找到System.out.printf("在第%d 条链表中找到 雇员 id = %d\n", (empLinkedListNO + 1), id);}else{System.out.println("在哈希表中,没有找到该雇员~");}}//编写散列函数, 使用一个简单取模法public int hashFun(int id) {return id % size;}public static void main(String[] args) {HashTab hashTab = new HashTab(4);for (int i = 0; i < 10; i++) {hashTab.add(new Emp(i+1,"张三"+(1+i)));}hashTab.list();hashTab.findEmpById(6);}}
