• 哈希表


    概念介绍

      有同学想了解哈希表,今天它来了!哈希表也叫做散列表,是一种根据Key值而直接进行访问的数据结构。它通过把Key值映射到表中一个位置来访问所存储的元素,对Key值进行映射的函数我们称之为散列函数,而存放记录的数组叫做散列表(概念如果不好理解,大家可以略过)。

      概念有时很抽象,咱们举个简单的栗子进行说明。

      现在咱们定义一个长度为10的数组用以进行数据进行存储,它长这个样子

      有一个同学,学号为1的小明同学,咱们需要把他的信息存储到数组中,该怎么添加和查找呢?

      咱们先简单的定义散列函数:取模,即f(Key)=Key%10,f(1) = 1%10 =1,即将小明同学的信息放入数组的a[1]的位置,查找的时候,也是同样的道理,先对Key进行hash,然后找,hash表是不是很简单呢?

      但是现在有一个学号为11的小王同学的信息也要添加进来,根据散列函数f(Key)=Key%10,f(11)=1。位置和小明冲突了,hash表是支持一山可容二虎的,该怎么做呢?用咱们原来学过的链表来处理,就行了。

      最终结果,如图

    代码实现

      1、先定义学生对象

    1 class Student {
    2     public int id;
    3     public String name;
    4 
    5     public Student(int id, String name) {
    6         this.id = id;
    7         this.name = name;
    8     }
    9 }

      2、定义咱们的hash表结构为数组+链表,简单的hash实现,取模处理

     1 public class HashTable {
     2 
     3     private LinkedList[] studentLinkedListArray;
     4     private int size;
     5 
     6     public HashTable(int size) {
     7         this.size = size;
     8         studentLinkedListArray = new LinkedList[size];
     9     }
    10 
    11     private  int hash(int id) {
    12         return id % size;
    13     }
    14 }

      3、添加学生的方法,hash找到数组下标的位置,再添加

     1     public void add(Student stu) {
     2         // 先对id进行hash,找到放入数组的下标位置
     3         int no = hash(stu.id);
     4         if(studentLinkedListArray[no]==null){
     5             LinkedList<Student> linkedList = new LinkedList<>();
     6             linkedList.add(stu);
     7             studentLinkedListArray[no] = linkedList;
     8         }
     9         else {
    10             studentLinkedListArray[no].add(stu);
    11         }
    12     }

      4、实现根据id查询对象的方法

     1     public void getById(int id){
     2         // 先对id进行hash,找到数组的下标位置
     3         int no = hash(id);
     4         if(studentLinkedListArray[no]==null){
     5             System.out.printf("没有找到id为%d的学生",id);
     6         }
     7         else {
     8             // 遍历链表中的节点,根据id判断元素是否存在
     9             Iterator it = studentLinkedListArray[no].iterator();
    10             while (it.hasNext()){
    11                 Student stu = (Student)it.next();
    12                 if(id == stu.id){
    13                     System.out.printf("找到id为%d的学生",id);
    14                     return;
    15                 }
    16             }
    17             System.out.printf("没有找到id为%d的学生",id);
    18         }
    19     }

      打完收工,Git地址:https://github.com/HollowCup/algorithms-and-data-structure,具体实现位于data-structure工程下的hash目录,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你介绍更多数据结构!

  • 相关阅读:
    myeclipse导入项目中的乱码问题的解决
    myeclipse中的jar包的引入与新建
    myeclipse如何修改默认存储文件路径
    oracle迁移数据到mysql
    如何设置myeclipse的编码格式
    tns的查找与修改
    在PL/SQL中输入SQL语句时关键字的首字母自动变成大写
    滤器处理中文编码
    题解导航
    莫队总结应用
  • 原文地址:https://www.cnblogs.com/maguanyue/p/11839851.html
Copyright © 2020-2023  润新知