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

哈希概念

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

哈希存储

现在有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;
    }
}

你可能感兴趣的:(算法,哈希算法,数据结构,散列表,java)