哈希表

傷城~ 2021-08-11 17:13 738阅读 0赞

【一】哈希表

他通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数就是散列函数。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RoZV9CZXN0X0hhY2tlcg_size_16_color_FFFFFF_t_70

【二】哈希表的价值

相当于一个缓存区,将常用的加入哈希表,减少对数据库的操作。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RoZV9CZXN0X0hhY2tlcg_size_16_color_FFFFFF_t_70 1

【三】自己写的哈希表

  1. import java.util.Scanner;
  2. public class HashTableTest {
  3. //4.测试
  4. public static void main(String[] args) {
  5. Scanner sc=new Scanner(System.in);
  6. StudentHashTab sht=new StudentHashTab(3);
  7. String key="";
  8. System.out.println("show:表示遍历栈");
  9. System.out.println("exit:表示退出程序");
  10. System.out.println("add:表示添加");
  11. System.out.println("find:表示查询");
  12. while(true) {
  13. key=sc.next();
  14. switch(key) {
  15. case "show":
  16. sht.list();
  17. break;
  18. case "exit":
  19. sc.close();
  20. System.exit(0);
  21. case "add":
  22. System.out.println("请输入id:");
  23. int id=sc.nextInt();
  24. System.out.println("请输入name:");
  25. String name=sc.next();
  26. sht.add(new Student(id,name));
  27. break;
  28. case "find":
  29. System.out.println("请输入id:");
  30. int sid=sc.nextInt();
  31. sht.findStudentById(sid);
  32. break;
  33. default:
  34. break;
  35. }
  36. }
  37. }
  38. }
  39. //3.HashTable=数组+链表
  40. class StudentHashTab{
  41. //定义数组大小以及数组
  42. private int size;
  43. private StudentList[] slist;
  44. StudentHashTab(int size){
  45. this.size=size;
  46. slist=new StudentList[size];
  47. //分别初始化每条链表
  48. for(int i=0;i<size;i++) {
  49. slist[i]=new StudentList();
  50. }
  51. }
  52. //添加元素
  53. public void add(Student stu) {
  54. int stuNo=hashFun(stu.id);
  55. slist[stuNo].add(stu);
  56. }
  57. //遍历数组
  58. public void list() {
  59. for(int i=0;i<size;i++) {
  60. slist[i].list(i);;
  61. }
  62. }
  63. public void findStudentById(int id) {
  64. int no=hashFun(id);
  65. Student stu=slist[no].findStudentById(id);
  66. if(stu!=null) {
  67. System.out.printf("在哈希表第%d条链表中找到该学生信息,学生名字为%s",no,stu.name);
  68. }else {
  69. System.out.printf("在哈希表中没有找到id为%d该雇员信息",id);
  70. }
  71. }
  72. //添加散列函数
  73. public int hashFun(int id) {
  74. return id%size;
  75. }
  76. }
  77. //2.链表
  78. class StudentList{
  79. private Student head;
  80. //添加节点
  81. public void add(Student stu) {
  82. //如果链表为空,则直接在头结点之后添加元素
  83. if(head==null) {
  84. head=stu;
  85. return;
  86. }
  87. //如果头结点不为空,遍历指针至尾节点,在尾节点后添加元素
  88. Student temp=head;
  89. while(true) {
  90. if(temp.next==null) {
  91. break;
  92. }
  93. temp=temp.next;
  94. }
  95. temp.next=stu;
  96. }
  97. public Student findStudentById(int id) {
  98. if(head==null) {
  99. System.out.println("链表为空,没有学生信息");
  100. return null;
  101. }
  102. Student temp=head;
  103. //两种情况:1.找到学生,返回学生信息 2.没有该学生相关的信息
  104. while(true) {
  105. if(temp.id==id) {
  106. break;
  107. }
  108. if(temp.next==null) {
  109. temp=null;
  110. break;
  111. }
  112. temp=temp.next;
  113. }
  114. return temp;
  115. }
  116. //遍历链表
  117. public void list(int no) {
  118. if(head==null) {
  119. System.out.println("第"+no+"链表为空");
  120. return;
  121. }
  122. System.out.print("第"+no+"链表信息为:");
  123. Student temp=head;
  124. while(temp!=null) {
  125. System.out.print("==>"+temp.id+"="+temp.name);
  126. temp=temp.next;
  127. }
  128. System.out.println();
  129. }
  130. }
  131. //1.节点
  132. class Student{
  133. public int id;
  134. public String name;
  135. public Student next;
  136. Student(int id,String name){
  137. this.id=id;
  138. this.name=name;
  139. }
  140. }

【四】代码部分输出示例

20190913204130390.png

发表评论

表情:
评论列表 (有 0 条评论,738人围观)

还没有评论,来说两句吧...

相关阅读

    相关

    什么是哈希表    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的[数据结构][Link 1]。也就是说,它通过把关键码

    相关

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

    相关

    我们知道,通过对数组进行直接寻址(Direct Addressing),可以在 O(1) 时间内访问数组中的任意元素。所以,如果存储空间允许,可以提供一个数组,为每个可能的关键

    相关

    哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0

    相关

    一、简介 如果所有的键都是小整数,那么我们可以用一个数组来实现无序的符号表,将键作为数组的索引i而数组中i(键)处储存的就是对应的值。 这样就可以快速地访问任意键的值,

    相关

    【一】哈希表 > 他通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数就是散列函数。 ![watermark_type_ZmFuZ3poZW5na