当前位置:   article > 正文

数据结构hash表_数据结构hanshi

数据结构hanshi

看一个实际需google公司的一个上机题:

有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该员工的id,要求查找到该员工的 所有信息.

要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)

哈希表的基本介绍

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

创建一个链表添加删除遍历

  1. class EmpLinkedList {
  2. //头指针,执行第一个Emp,因此我们这个链表的head 是直接指向第一个Emp
  3. private Emp head; //默认null
  4. //添加雇员到链表
  5. //说明
  6. //1. 假定,当添加雇员时,id 是自增长,即id的分配总是从小到大
  7. // 因此我们将该雇员直接加入到本链表的最后即可
  8. public void add(Emp emp) {
  9. //如果是添加第一个雇员
  10. if(head == null) {
  11. head = emp;
  12. return;
  13. }
  14. //如果不是第一个雇员,则使用一个辅助的指针,帮助定位到最后
  15. Emp curEmp = head;
  16. while(true) {
  17. if(curEmp.next == null) {//说明到链表最后
  18. break;
  19. }
  20. curEmp = curEmp.next; //后移
  21. }
  22. //退出时直接将emp 加入链表
  23. curEmp.next = emp;
  24. }
  25. //遍历链表的雇员信息
  26. public void list(int no) {
  27. if(head == null) { //说明链表为空
  28. System.out.println("第 "+(no+1)+" 链表为空");
  29. return;
  30. }
  31. System.out.print("第 "+(no+1)+" 链表的信息为");
  32. Emp curEmp = head; //辅助指针
  33. while(true) {
  34. System.out.printf(" => id=%d name=%s\t", curEmp.id, curEmp.name);
  35. if(curEmp.next == null) {//说明curEmp已经是最后结点
  36. break;
  37. }
  38. curEmp = curEmp.next; //后移,遍历
  39. }
  40. System.out.println();
  41. }
  42. //根据id查找雇员
  43. //如果查找到,就返回Emp, 如果没有找到,就返回null
  44. public Emp findEmpById(int id) {
  45. //判断链表是否为空
  46. if(head == null) {
  47. System.out.println("链表为空");
  48. return null;
  49. }
  50. //辅助指针
  51. Emp curEmp = head;
  52. while(true) {
  53. if(curEmp.id == id) {//找到
  54. break;//这时curEmp就指向要查找的雇员
  55. }
  56. //退出
  57. if(curEmp.next == null) {//说明遍历当前链表没有找到该雇员
  58. curEmp = null;
  59. break;
  60. }
  61. curEmp = curEmp.next;// 后移判断下一个id
  62. }
  63. return curEmp;
  64. }
  65. }

编写散列函数, 使用一个简单取模法更具id分配到不同列表中

  1. public int hashFun(int id) {
  2. return id % size;
  3. }

 创建hashTable

  1. class HashTab {
  2. private EmpLinkedList[] empLinkedListArray;
  3. private int size; //表示有多少条链表
  4. //构造器
  5. public HashTab(int size) {
  6. this.size = size;
  7. //初始化empLinkedListArray
  8. empLinkedListArray = new EmpLinkedList[size];
  9. //?留一个坑, 这时不要忘了初始化每个链表 不然空指针异常
  10. for(int i = 0; i < size; i++) {
  11. empLinkedListArray[i] = new EmpLinkedList();
  12. }
  13. }
  14. //添加雇员
  15. public void add(Emp emp) {
  16. //根据员工的id ,得到该员工应当添加到哪条链表
  17. int empLinkedListNO = hashFun(emp.id);
  18. //将emp 添加到对应的链表中
  19. empLinkedListArray[empLinkedListNO].add(emp);
  20. }
  21. //遍历所有的链表,遍历hashtab
  22. public void list() {
  23. for(int i = 0; i < size; i++) {
  24. empLinkedListArray[i].list(i);
  25. }
  26. }
  27. //根据输入的id,查找雇员
  28. public void findEmpById(int id) {
  29. //使用散列函数确定到哪条链表查找
  30. int empLinkedListNO = hashFun(id);
  31. Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id);
  32. if(emp != null) {//找到
  33. System.out.printf("在第%d条链表中找到 雇员 id = %d\n", (empLinkedListNO + 1), id);
  34. }else{
  35. System.out.println("在哈希表中,没有找到该雇员~");
  36. }
  37. }
  38. //编写散列函数, 使用一个简单取模法更具id分配到不同列表中
  39. public int hashFun(int id) {
  40. return id % size;
  41. }
  42. }

 

 

 

 

 

 

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号