美文网首页
哈希表的基本介绍

哈希表的基本介绍

作者: 乙腾 | 来源:发表于2020-09-24 06:26 被阅读0次

Hash table 介绍

94965625.png

练习题

95031937.png

notice:

hash表的组成:
数组:维护链表的指针,也就是关键码值 key 可以按照某一规律维护,比如:取模来维护链表的指针。
链表:用来存值
取模:
公式:a mod b = a - b[a/b] ([a/b]表示整数商)
取模例子
简述 商值 取模值

430450453.png

code

EmpLinkedList

package com.pl.arithmetic.hash;

import com.pl.arithmetic.dto.HeroNode;
import lombok.extern.slf4j.Slf4j;

/**
 * <p>
 *
 * @Description: TODO
 * </p>
 * @ClassName EmpLinkedList
 * @Author pl
 * @Date 2020/9/20
 * @Version V1.0.0
 */
@Slf4j
public class EmpLinkedList {

    private HeroNode headNode;

    /**
     *员工链表添加
     *
     * @param heroNode
     * @return void
     * @exception
     * @author silenter
     * @date 2020/9/20 10:11
    */
    public void add(HeroNode heroNode){
        //@1 非空判断
        if (headNode ==null) {
            headNode = heroNode;
            return;
        }
        //@2 查找最后一个节点
        //局部变量 线程安全,对象引用,不创建新地址值,指向同一个地址。
        HeroNode indexNode = headNode;
        while (true){
            if (indexNode.next == null){
                break;
            }
            indexNode = indexNode.next;
        }
        indexNode.next = heroNode;
    }

    /**
     *员工链表遍历
     *
     * @param arrIndex
     * @return void
     * @exception
     * @author silenter
     * @date 2020/9/20 10:11
    */
    public void list(int arrIndex){
        arrIndex ++;
        //@1 链表非空判断 headnode非空
        if (headNode == null){
            System.out.println("第"+arrIndex+"链表为空");
            return;
        }
        //@2 遍历输出
        System.out.print("第"+arrIndex+"链表详情:");
        HeroNode indexNode = headNode;
        while (true){
            System.out.printf("=> id=%d name = %s\t",indexNode.no,indexNode.name);
            if (indexNode.next ==null)
                break;
            indexNode = indexNode.next;
        }
        System.out.println();
    }

    /**
     * 根据id匹配
     * @param id   员工id
     * @return com.pl.arithmetic.dto.HeroNode
     * @exception 
     * @author silenter
     * @date 2020/9/20 10:09
    */
    public HeroNode findById(int id){
        //@1 链表非空判断 headnode非空
        if (headNode == null){
            System.out.println("无此员工");
            return null;
        }
        //@2 遍历匹配
        HeroNode indexNode = headNode;
        while (true){
            if (indexNode.no == id){
                break;
           }
           if (indexNode.next == null){
                indexNode = null;
                break;
           }
           indexNode = indexNode.next;
        }
        return indexNode;
    }
}

HashTableTest

package com.pl.arithmetic.hash;

import com.pl.arithmetic.dto.HeroNode;

/**
 * <p>
 *
 * @Description: 哈希表练习
 * </p>
 * @ClassName HashTableTest
 * @Author pl
 * @Date 2020/9/20
 * @Version V1.0.0
 */
public class HashTableTest {

    private EmpLinkedList[] empLinkedLists;

    //链表数
    private int size;

    public HashTableTest(int size){
        this.size = size;
        this.empLinkedLists = new EmpLinkedList[size];
        for (int i = 0; i < empLinkedLists.length; i++) {
            empLinkedLists[i] = new EmpLinkedList();
        }
    }

    /**
     * 获取链表索引位
     *
     * @param id
     * @return int
     * @exception
     * @author silenter
     * @date 2020/9/20 10:19
     */
    public int getLinkedIndex(int id){
        return id%size;
    }

    /**
     * hash添加
     *
     * @param heroNode
     * @return void
     * @exception
     * @author silenter
     * @date 2020/9/20 10:21
    */
    public void add(HeroNode heroNode){
        //@1 先获取算出应添加到哪个链表中
        int linkedIndex = getLinkedIndex(heroNode.no);
        //@2 在指定的链表中添加
        empLinkedLists[linkedIndex].add(heroNode);
    }


    /**
     * 遍历
     *
     * @param
     * @return void
     * @exception
     * @author silenter
     * @date 2020/9/20 10:24
    */
    public void list(){
        for (int i = 0; i < empLinkedLists.length; i++) {
            empLinkedLists[i].list(i);
        }
    }

    /**
     * 根据id检索
     *
     * @param id
     * @return com.pl.arithmetic.dto.HeroNode
     * @exception
     * @author silenter
     * @date 2020/9/20 10:27
    */
    public void getById(int id){
        int linkedIndex = getLinkedIndex(id);
        HeroNode heroNode = empLinkedLists[id].findById(id);
        if (heroNode!=null){
            System.out.println("检索到对象"+heroNode.toString());
        }else {
            System.out.println("没有检索到对象");
        }
    }

}

MainTest

package com.pl.arithmetic.hash;

import com.pl.arithmetic.dto.HeroNode;

/**
 * <p>
 *
 * @Description: TODO
 * </p>
 * @ClassName MainTest
 * @Author pl
 * @Date 2020/9/20
 * @Version V1.0.0
 */
public class MainTest {

    public static void main(String[] args) {

        HashTableTest hashTableTest = new HashTableTest(7);

        hashTableTest.add(new HeroNode(1,"xxx","yyyy"));
        hashTableTest.add(new HeroNode(5,"www","qqq"));
        hashTableTest.add(new HeroNode(7,"777","rrr"));
        hashTableTest.add(new HeroNode(8,"zzz","vvv"));

        hashTableTest.list();
        System.out.println("查询");
        hashTableTest.getById(1);
    }
}
100629125.png

相关文章

  • 哈希表的基本介绍

    Hash table 介绍 练习题 notice: hash表的组成:数组:维护链表的指针,也就是关键码值 key...

  • 哈希法-哈希表介绍、构造方法、解决冲突办法

    哈希法-哈希表介绍   哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表称为哈希表。这种方法的基本思想是:...

  • Java数据结构_哈希表_基本概念

    本文目标 哈希表的基本概念,哈希冲突,哈希函数 什么是哈希表 哈希表也叫做散列表(hash有剁碎的意思)哈希表是空...

  • 哈希表

    1.哈希表原理 哈希表的基本思想是:用哈希函数 f: key -> address将关键字映射到该记录在表中的位置...

  • ConcurrentSkipListMap源码解析

    跳表的基本介绍: ConcurrentSkipListMap是线程安全的有序的哈希表,适用于高并发的场景。Conc...

  • JavaScript 数据结构之哈希表(散列表)

    一、 哈希表的介绍 1. 哈希表的优势 哈希表通常是基于数组实现的,但相对于数组,它有很多优势 快速的插入、删除、...

  • day14

    哈希表 介绍: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数...

  • 哈希表—什么是哈希表

    冰冻非一日之寒 哈希表是一种数据结构~ 基本概念 哈希表可以存储各种类型的数据,当我们从哈希表中查找所需要的数据时...

  • Scala基础(5)- 数组

    数组是最基本的数据结构。通常的语法或数据结构书都会先介绍数组,而后再介绍集合,链表,树,哈希表等等。我们也不例外。...

  • 哈希算法

    1.哈希表介绍 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数...

网友评论

      本文标题:哈希表的基本介绍

      本文链接:https://www.haomeiwen.com/subject/jvoayktx.html