哈希表
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);
}
}