哈希表

Google上机题
1)看一个实际需求,google公司的一个上机题:
2)有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该员工的id时,要求查找到该员工的所有信息.
3)要求:不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)

基本介绍

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
image.png

分析

添加时,保证按照id从低到高插入
使用链表来实现哈希表,该链表不带表头[即:链表的第一个结点就存放雇员信息]
image.png

代码

  1. package com.sgg.datastructure.hashtable;
  2. public class HashTab {
  3. private EmpLinkedList[] empLinkedListArray;
  4. private int size; //表示有多少条链表
  5. public HashTab(int size) {
  6. this.size = size;
  7. empLinkedListArray = new EmpLinkedList[size];
  8. //?留一个坑, 这时不要分别初始化每个链表
  9. for (int i = 0; i < size; i++) {
  10. empLinkedListArray[i] = new EmpLinkedList();
  11. }
  12. }
  13. //添加雇员
  14. public void add(Emp emp) {
  15. //根据员工的 id ,得到该员工应当添加到哪条链表
  16. int empLinkedListNO = hashFun(emp.id);
  17. //将 emp 添加到对应的链表中
  18. empLinkedListArray[empLinkedListNO].add(emp);
  19. }
  20. public void list() {
  21. for (int i = 0; i < size; i++) {
  22. System.out.println("开始打印"+(1+i));
  23. empLinkedListArray[i].list();
  24. }
  25. }
  26. public void findEmpById(int id) {
  27. //使用散列函数确定到哪条链表查找
  28. int empLinkedListNO = hashFun(id);
  29. Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id);
  30. if(emp != null) {//找到
  31. System.out.printf("在第%d 条链表中找到 雇员 id = %d\n", (empLinkedListNO + 1), id);
  32. }else{
  33. System.out.println("在哈希表中,没有找到该雇员~");
  34. }
  35. }
  36. //编写散列函数, 使用一个简单取模法
  37. public int hashFun(int id) {
  38. return id % size;
  39. }
  40. public static void main(String[] args) {
  41. HashTab hashTab = new HashTab(4);
  42. for (int i = 0; i < 10; i++) {
  43. hashTab.add(new Emp(i+1,"张三"+(1+i)));
  44. }
  45. hashTab.list();
  46. hashTab.findEmpById(6);
  47. }
  48. }