映射二分堆

本文介绍了映射二分堆的概念及其与普通堆的区别。映射二分堆通过保存指向数据单元的指针而非数据单元本身,提高了数据交换效率,并支持按指定索引删除数据单元。

转自:http://eriol.iteye.com/blog/1174672

平常,我们用堆最常见的就是随机地加入元素,随机地取最大值或最小值。这些基本的操作C++中的priority_queue和set都能很好的完成,而且C++中还有一个make_heap,效率较前面2个会更高。而且前面提到的STL都是采用红黑树实现的,很具有稳定性。

 

上面的堆虽然使用简单,但功能上还是有些局限。比如前面提到的堆都只能实现删除最值并没有办法删除指定的值。而且一般STL中的堆都是采用数据存储的,但父亲节点和儿子节点需要交换时,我们需要拷贝所存储的整个数据单元,但数据单元较大时,拷贝的效率就低了。因此,这里介绍一中堆变种,在堆中引入了映射。

 

 

定义

 

具有映射功能的堆称为双向映射堆。又因其常常是在二分堆的基础上实现的,所以也常常叫映射二分堆。

 

 

特点

 

映射二分堆其与普通堆不同的地方是它的节点并不真正保存数据单元本身,而是保存指向数据单元的指针。因此当需要交换父子节点的数据时,我们可以避免拷贝大量数据所消耗的时间。同时,映射二分堆还有一个功能,它可以根据具体的数据单元的索引来删除该单元,即使这个单元不是堆中的最值。

 

 

实现

 

在实现时,我们可以用数字 H[] 存储数据单元,然后采用数组 ind[i]=j 表示 H[i] 存放的是索引号为 j 的数据,mp[j]=i 表示索引索引为 j 的元素存储在 H[i] 中,这样就可以实现双向映射了。

 

(1) 插入堆,我们只需要将插入的元素放在堆尾,然后逐级调整,这个跟普通的二叉堆一样。

 

(2) 删除最值,也跟普通的二叉堆一样,先把堆中最后一个元素与最值对调,然后再调整堆。

 

(3) 删除固定索引的数据单元。我们可以先通过 mp[i],找到其在 H[] 中存放的位置,然后该位置的值跟堆最后一个元素对调,接着从该节点向上调整堆,此时得到的还不是一个正规的堆,还需要重新堆整个堆进行从上到下调整。

 

上面的3中操作中都提到了堆的调整,在调整时我们不需要拷贝数据单元,我们只需交换 ind[] 和 mp[] 2个数组的对应值即可。

由于所给引用内容未涉及背钻板厚分的相关信息,以下是结合专业知识对背钻板厚分的介绍。 背钻是一种用于印制电路板(PCB)制造的技术,主要用于消除多层板中不需要的通孔部分,以减少信号传输过程中的反射和损耗,提高信号完整性。背钻板厚分是在背钻工艺中对不同厚度的PCB进行分组的操作,其目的是为了提高生产效率、保证产品质量和优化工艺参数。 ### 分依据 - **板厚规格**:将具有相同或相近板厚的PCB归为同一。常见的PCB板厚规格有0.2mm、0.4mm、0.6mm、0.8mm、1.0mm、1.2mm、1.6mm、2.0mm等。不同的板厚在背钻过程中需要不同的钻孔深度和参数设置,按照板厚分可以确保每一的PCB在背钻时使用相对统一的工艺参数。 - **生产批量**:根据生产订单的批量大小进行分。对于大批量相同板厚的PCB,可以单独分为一进行连续生产,提高生产效率。而小批量不同板厚的PCB可以根据实际情况进行适当合并,但要注意工艺参数的调整。 - **板厚公差**:即使是同一规格的板厚,实际生产中也会存在一定的公差。将板厚公差相近的PCB分在同一,可以减少背钻过程中因板厚差异导致的钻孔深度误差。 ### 分方法 - **指定数量的分**:根据生产计划或设备的生产能力,指定每的PCB数量。例如,每固定放置50块板厚为1.6mm的PCB。这种方法适用于生产批量较大且稳定的情况,可以方便生产管理和工艺控制。 - **未指定数量的分**:根据板厚的分布情况进行分类,然后将相同板厚的PCB自由组合成。例如,将所有板厚为1.0mm的PCB归为一类,然后根据实际生产情况将它们分成若干。这种方法灵活性较高,适用于小批量、多品种的生产模式。 - **指定元素的分**:如果在分时,有特殊要求的PCB,如某些板厚需要特殊的背钻工艺或有特定的生产顺序要求,则先安排这些特殊要求的PCB,再将其他普通的PCB进行分。例如,对于一些有高精度信号要求的PCB,需要单独分并采用更严格的工艺参数进行背钻。 ### 分的重要性 - **提高生产效率**:通过合理的分,可以减少背钻设备在不同板厚之间切换工艺参数的时间,提高设备的利用率和生产效率。 - **保证产品质量**:同一的PCB板厚相近,背钻时可以使用相对统一的工艺参数,减少因板厚差异导致的钻孔深度误差,从而保证背钻质量的一致性。 - **优化工艺参数**:根据不同的板厚特点,可以针对性地优化背钻工艺参数,如钻孔速度、进给量、钻头直径等,提高背钻的精度和可靠性。 ### 代码示例(Python模拟指定数量的分) ```python # 假设这是所有PCB板厚的列表 pcb_thicknesses = [1.6, 1.6, 1.0, 1.0, 1.6, 1.2, 1.2, 1.0] # 指定每的数量 pile_size = 3 # 分函数 def divide_into_piles(thicknesses, size): piles = [] current_pile = [] for thickness in thicknesses: current_pile.append(thickness) if len(current_pile) == size: piles.append(current_pile) current_pile = [] if current_pile: piles.append(current_pile) return piles # 执行分 result_piles = divide_into_piles(pcb_thicknesses, pile_size) for i, pile in enumerate(result_piles): print(f"第 {i + 1} 的板厚: {pile}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值