java学习笔记(一)

本文介绍了优先队列的概念及其与普通队列的区别,并详细解释了如何利用二叉堆实现优先队列。讨论了二叉堆的特性,如完全二叉树结构、最大堆与最小堆等,并给出了具体的数组存储方式及上浮操作实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是优先队列

普通队列:先进先出;后进后出
优先队列:出队顺序和入队顺序无关;和优先级有关
动态处理:首先处理优先级高的,同时会进入其他的请求

堆的基础表示

一个堆也是一棵树
使用二叉树来表示一个堆,通常也可以表示为二叉堆
满二叉树:除了叶子结点,其他所有节点的孩子节点都不为空
二叉堆是一颗完全二叉树
完全二叉树:把元素排成树的形状。(将元素一层一层的放,右下角有可能是空的)
二叉堆:堆中某个节点的值总是不大于其父亲节点的值(根节点最大,最大堆,相应也可以对应最小堆)
用数组存储二叉堆
索引从1标:
parent(i)=i/2(一个奇数除以2,后面的小数是要抹去的)
left child (i)= 2i
right child(i)=2
i+1
索引从0标:
parent(i)=(i-1)/2
left child (i)= 2i+1
right child(i)=2
i+2

向堆中添加元素(主要步骤):
定一个add函数

//向堆中添加元素
    public void add(E e){
        data.addLast(e);
        siftUp(data.getSize() - 1);
    }

定义一个swap交换函数

 public void swap(int i,int j){
        if(i<0 || i>=size || j<0||j>=size)
            throw new IllegalArgumentException("Index is illegal.");

        E t = data[i];
        data[i] = data[j];
        data[j] = t;
    }

数据上浮siftUp

//上浮
    private void siftUp(int k){

        while(k <0 && data.get(parent(k)).compareTo(data.get(k)) < 0){
            data.swap(k,parent(k));
            k = parent(k);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值