算法系列第二篇博客文章
本文讨论的是近似装箱问题中的联机算法且本文所提出的改进算法不太适合用于内存分配问题
following are details.
一、背景
1.近似装箱问题
将N个大小为 si 的物品,si≤1,i=1,2,…,N,放入多个大小为1的箱子中,需要多少个箱子?
2.两类算法
联机算法:对输入数据依次处理,必须将一件物品放入一个箱子之后才处理下一件物品。
脱机算法:做任何事都需要等到所有的输入数据全被读入之后才进行。
(本文只讨论联机算法)
二、一般的适应算法
1.下项适应算法
对于每一个物品,查看上一个箱子的剩余空间是否足够放入该物品,若无法放入,则开辟一个新箱子。该算法以线性时间运行,若最优装箱用箱 M M M个,则该算法用箱不超过 2 M − 2 2M-2 2M−2个。
2.首次适应算法
对于每一个物品,依次查看每个箱子的剩余空间,将物品放入查找到的第一个具有足够剩余空间的箱子中,若无适合的箱子,则开辟一个新箱子。该算法的时间复杂度为 O(N2) ,若最优装箱用箱 M M M个,则该算法用箱不超过 1.7 M 1.7M 1.7M向上取整个。
3.最佳适应算法
对于每一个物品,查看所有箱子的剩余空间,将该物品放入一个足以放入该物品且使得箱子最满的箱子,若无适合的箱子,则开辟一个新箱子。该算法的时间复杂度为 O(N2) ,若最优装箱用箱 M M M个,则该算法用箱不超过 1.7 M 1.7M 1.7M向上取整个。
三、改良版适应算法
为了减少查找有足够空间的箱子的时间,使用优先队列存放箱子数据。
以基于二叉堆的优先队列为例,使用大顶堆保存每个箱子的剩余空间。
对于每个物品,查看顶点箱子是否有足够的容纳空间。若足够放入,则重新计算该箱子剩余空间大小并下调二叉堆(或是取出该箱子,放入物品后将该箱子置于优先队列尾部,上调二叉堆);若无法放入,则开辟一个新箱子,将物品放入后计算该箱子剩余空间并将其放入优先队列尾部,上调二叉堆。
该算法对每个物品操作的时间复杂度均为O(logN),整个算法的时间复杂度为O(NlogN)。所需箱子数上限具体多少我也不知道,猜测应该接近首次适应算法。如果有谁算出来了记得告诉我,我也想知道
It’s the end of the article. 创作不易,转载请标明出处