您的位置:首页 > 理论基础 > 数据结构算法

共同学习Java源代码-数据结构-PriorityQueue类(八)

2018-01-19 21:38 330 查看
    private void heapify() {

        for (int i = (size >>> 1) - 1; i >= 0; i--)

            siftDown(i, (E) queue[i]);
    }

这个方法是堆化的方法 我现在才搞明白PriorityQueue的存储方式是用数组存储二叉树 0下标为根节点 2n+1下标为左节点 2n+2下标为右节点 (n-1)/2下标为父节点 n为数组下标值 

PriorityQueue是完全二叉树和最小堆 这个方法就是保证堆不变性 就是每个父节点都要小于左右子节点 

实现过程就是遍历数组前一半的元素 然后挨个调用siftDown方法

    public Comparator<? super E> comparator() {

        return comparator;

    }

comparator的getter

    private void writeObject(java.io.ObjectOutputStream s)

        throws java.io.IOException {

        s.defaultWriteObject();

        s.writeInt(Math.max(2, size + 1));

        for (int i = 0; i < size; i++)

            s.writeObject(queue[i]);

    }

这个是序列化输出的方法 

多数步骤都和以前的Collection实现类一样 就是writeInt那块是写出2和size+1的最大值 作为数组长度

    private void readObject(java.io.ObjectInputStream s)

        throws java.io.IOException, ClassNotFoundException {

        s.defaultReadObject();

        s.readInt();

        queue = new Object[size];

        for (int i = 0; i < size; i++)

            queue[i] = s.readObject();

        heapify();

    }

这个是序列化读入的方法 和多数Collection实现类大致相同 

就是最后调用heapify方法调整二叉树在数组中的顺序

PriorityQueue讲解完毕 这个类我到了最后才明白大致原理所以之前的讲解可能有误 请见谅
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: