算法通关村-----哈希和队列的基本知识

哈希概念

哈希也称为散列,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出值就是散列值。

哈希存储

现在有1,2,3…15,要将其存储到大小为7的哈希表中,应该如何存储

首先选择哈希函数 index = number % 7

通过哈希函数,可以将要存储的数据映射为对应的下标。

结果如图所示

存储

哈希冲突

很明显,按照上面的哈希函数进行存储会出现碰撞,即不同的输入经过散列函数得到的输出是相通的。很明显数组的同一位置不能存储两个元素。应该如何解决呢

处理方法

开放定址法

一旦发生冲突,就去寻找下一个散列地址,只要散列表足够大,总能找到空的散列地址,并将记录录入。

链地址法

将哈希表的每个单元作为链表的头节点,所有哈希地址为i的元素构成一个链表,形成数组➕链表的形式,HashMap的JDK7就是如此,在JDK8改成数组➕链表➕红黑树的形式,做了进一步优化。

队列概念

队列也是访问受限的线性表,遵循先入先出规则,即先入队的元素先出队,后入队的元素后出队。队列同样可以使用数组和链表实现。下面是链表实现队列的方式

public class ListQueue {
    private Node front;
    private Node rear;
    private Integer size;

    public ListQueue() {
        front = new Node(-1);
        rear = new Node(-1);
        size = 0;
    }

    public void push(int value) {
        Node node = new Node(value);
        Node iter = front;
        while (iter.next != null) {
            iter = iter.next;
        }
        iter.next = node;
        rear = node;
        size++;
    }

    public int pull() {
        Node node = front.next;
        if (node == null) {
            throw new RuntimeException("队列已空");
        }
        front = node.next;
        size--;
        return node.data;
    }
    
    public int getLength(){
        return size;
    }
}

class Node {
    int data;
    Node next;

    public Node(int data) {
        this.data = data;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天不coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值