美文网首页
05-哈希表

05-哈希表

作者: 唔哒喂 | 来源:发表于2021-09-20 11:39 被阅读0次

根据尚硅谷韩顺平老师教程。
根据学习可知哈希表的结构大致如下


HashTab.png

完整代码见底部

HashTab

可以看出在哈希表中用数组方式存储了(size个)链表的头结点。

class HashTab{
    int size;
    Node[] nodes;
}

每一个node存储在哪条链表中的选择是根据 散列函数:num % size;
size是创建HashTab是确定的数据。而num则来自于node中的属性。
根据所学教程,num来自于node中的id。

public int hashIndex(int id){
        return id % size;
    }

由此在插入node时
可知 node 应插入哪一条链表

public void insertNode(Node node){
        if (node == null)
            return;
        int i = hashIndex(node.getId());
        nodes[i].insertNode(node);
    }

在已知id的情况下获取信息时
可知当前id应存在于哪一条链表,遍历比对即可获取信息。

public Node findNode(int id){
        int i = hashIndex(id);
        return nodes[i].findNode(id);
    }

Node

根据所学所创建的Node中包含
Id,name,next指针

class Node{
    Node next;
    int id;
    String name;
}

在插入数据时,从应插入数据的链表的头结点开始,开始遍历,出现null即在此条链表中插入数据。

public void insertNode(Node node) {
        Node p = this;
        while (p.next != null)
            p = p.next;
        p.next = node;
    }

获取数据类似

public Node findNode(int id) {
        if (this.next == null)
            return null;
        Node p = this.next;
        while (p != null){
            if (p.getId() == id)
                return p;
            p = p.next;
        }
        return null;
    }

完整代码

HashTab

class HashTab{

    int size;
    Node[] nodes;


    public HashTab(int size) {
        this.size = size;
        this.nodes = new Node[size];
//        创建头结点。
        for (int i = 0; i < size; i++) {
            nodes[i] = new Node();
        }

    }
//  插入node
    public void insertNode(Node node){
        if (node == null)
            return;
        int i = hashIndex(node.getId());
        nodes[i].insertNode(node);
    }

//  散列函数
    public int hashIndex(int id){
        return id % size;
    }
//    显示整个表信息
    public void listHashTab(){
        for (int i = 0; i < size; i++) {
            nodes[i].listNodeList(i);
        }
    }
    // 查询node
    public Node findNode(int id){
        int i = hashIndex(id);
        return nodes[i].findNode(id);
    }
}

Node

class Node{
    Node next;
    int id;
    String name;

    public Node(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Node() {
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Node{"+"id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public void insertNode(Node node) {
        Node p = this;
        while (p.next != null)
            p = p.next;
        p.next = node;
    }
//    显示整个表信息
    public void listNodeList(int i) {
        System.out.print(i);
        Node p = this.next;
        while (p != null){
            System.out.print("--->");
            System.out.print(p);
            p = p.next;
        }
        System.out.println();
    }

    public Node findNode(int id) {
        if (this.next == null)
            return null;
        Node p = this.next;
        while (p != null){
            if (p.getId() == id)
                return p;
            p = p.next;
        }
        return null;
    }
}

测试

public class HashReview {
    public static void main(String[] args) {

//        新建hash表 指定hash表的大小
        HashTab hashTab = new HashTab(5);
//        手动新建几个需要插入的节点。
        Node ss = new Node(1, "ss");
        Node cc = new Node(2, "cc");
        Node zz = new Node(3, "zz");
        Node qq = new Node(8, "qq");
        hashTab.insertNode(ss);
        hashTab.insertNode(cc);
        hashTab.insertNode(zz);
        hashTab.insertNode(qq);

//        输出hash表
        hashTab.listHashTab();
        System.out.println(hashTab.findNode(8));

    }
}

测试时输出结果

Test.jpg

相关文章

  • 05-哈希表

    根据尚硅谷韩顺平老师教程。根据学习可知哈希表的结构大致如下 完整代码见底部 HashTab 可以看出在哈希表中用数...

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

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

  • redis数据结构--字典

    Redis的字典底层就是哈希表。 哈希表 首先给出哈希表的定义: 其中可以看到,table是一个哈希表节点的数组,...

  • 哈希表和链表

    优秀文章:Chapter: 散列表(哈希表) 一、哈希表 哈希表hashtable(key,value) 就是把K...

  • 算法-哈希表算法总结

    1 哈希表模拟 思路:通过设计哈希表,模拟O(1)时间复杂度的哈希表。 2 数组作为哈希表 思路:数组就是简单的哈...

  • 数据结构 -- 哈希表及其应用

    这篇主要用来记录一下学习到的关于哈希表的知识点。 文章结构 哈希表 哈希表的定义 哈希表的优缺点 哈希碰撞 负载因...

  • 数据结构与算法(第一季):哈希表(Hash Table)

    一、哈希表(Hash Table) 1、概念 哈希表也叫做散列表。 哈希表的原理: 利用哈希函数生成key对应的i...

  • 深入理解哈希表

    深入理解哈希表 深入理解哈希表

  • 2019 算法面试相关(leetcode)--哈希表

    哈希表相关的原理可以参考下:浅谈哈希表(HashTable)深入理解哈希表哈希表的理解理解HashSet及使用 哈...

  • Redis中的字典

    Redis中的字典 Redis中的字典使用哈希表作为底层实现,一个哈希表中可以有多个哈希表结点,而每个哈希表结点保...

网友评论

      本文标题:05-哈希表

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