博客
关于我
Gym 102770 B-Bin Packing Problem 2020浙江省省赛 (线段树 + set)
阅读量:608 次
发布时间:2019-03-13

本文共 1705 字,大约阅读时间需要 5 分钟。

装箱问题算法对比

算法分析

装箱问题是操作系统中的经典问题,比较了首次适应算法和最佳适应算法的性能差异。本文将分析两种算法在处理相同请求序列时的行为特点,并分别模拟其申请的箱子数量。

首次适应算法

在首次适应算法中,系统优先将当前请求大小分配给一个空闲的最小箱体,或者找出能够容纳该请求的最小箱体。如果找不到合适的箱体,系统申请一个容量等于请求大小的新箱体。为了高效实现这一过程,系统需要快速查找最前面的第一个大于等于当前请求的箱体。这里我们使用线段树来维护箱体容量,线段树的区间最大值查询能够快速找到最前面的满足条件的箱体。

最佳适应算法

最佳适应算法则将当前请求分配给一个能够容纳该请求的最大的箱体,而不是最小的。如果没有符合条件的箱体,系统申请一个容量等于请求大小的新箱体。为了实现这一过程,系统需要高效地检测是否存在一个适合的箱体。使用平衡多重集合(multiset)能够快速完成这一任务。

模拟实现

首次适应算法模拟

#include 
#include
#include
using namespace std;int main(){ int n = 100; vector
a(n); // 假设a数组已读入,包含请求序列 vector
tree(4*n, c); // 例子简化,实际应使用线段树的结构 // 线段树初始化 void build(int node, int l, int r) { if(l == r) tree[node] = c; else { int mid = (l + r) / 2; build(2*node, l, mid); build(2*node+1, mid+1, r); tree[node] = max(tree[2*node], tree[2*node+1]); } } void query(int node, int l, int r, int val) { if(l == r) return -1; // 表示区间不存在满足条件的箱体 int leftTranslator = tree[2*node]; if(leftTranslator >= val) p = query(2*node, l, mid, val); else p = query(2*node+1, mid+1, r, val); return p; } int cnt = 0; for(int i=0; i

最佳适应算法模拟

#include 
#include
#include
using namespace std;int main(){ int n = 100; vector
a(n); // 假设a数组已读入,包含请求序列 multiset
st; for(int i=0; i

结果输出

每次运行程序会输出两种算法下申请的总箱子数。

性能对比

通过测试可以看到,最佳适应算法通常能减少箱子使用量,但增加了每次查找操作的复杂度。最优适应算法通过容错机制得到更优的结果,但至少需要一个额外的箱体来容纳最差情况。

优化方案

如需进一步优化,可以考虑使用优先队列来提升查找效率。

转载地址:http://szpaz.baihongyu.com/

你可能感兴趣的文章
嵌入式系统试题库(CSU)
查看>>
图神经网络7日打卡营学习心得
查看>>
【自考】之信息资源管理(一)
查看>>
setup facatory9.0打包详细教程(含静默安装和卸载)
查看>>
ionic4 路由跳转传值
查看>>
pwn题shellcode收集
查看>>
2018年3月最新的Ubuntu 16.04.4漏洞提权代码
查看>>
java.security.InvalidKeyException: Illegal key size
查看>>
Linux kernel pwn --- CSAW2015 StringIPC
查看>>
配置jdk的环境变量
查看>>
编译android源代码(aosp)
查看>>
IDEA 找不到 Persistence窗口解决办法
查看>>
维基百科之AndroidRoot
查看>>
C++ Primer Plus读书笔记:循环读取(错误处理)
查看>>
skimage与cv2 安装失败的解决办法
查看>>
关于吴恩达的深度学习的一些授课视频里面英文翻译错误的实例展示
查看>>
伴随矩阵和逆矩阵的关系证明
查看>>
突破Bias-Variance困境
查看>>
Form窗体属性
查看>>
解决宝塔安装wordpress无法连接到数据库问题
查看>>