码迷,mamicode.com
首页 > 其他好文 > 详细

装箱问题(NP问题)

时间:2015-05-06 13:19:39      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:装箱   np   首次适应   

问题描述

有n个物品,体积为 v[i],i = 1..n。 现在有若干同样的箱子,体积为C,C > v[i], i = 1..n。问最少需要多少箱子,才能装下所有的物品。

问题求解

这类问题是NP问题,即可以在多项式时间内验证一个解是否OK,但是不可以在多项式时间内求得该解。
装箱问题,有个近似解。

First Fit (FF)

首次适应解法。对于物品 i ,从当前装了物品的箱子中找到首个,其剩余容量可以放下物品 i 的箱子,如果该箱不存在,那么就放入到新箱子中。显然最多需要 n 个箱子即可。时间复杂度为 O(n^2),当然,通过 tournament tree 可以将时间复杂度将为 O (n log n)。

tournament tree,为一棵完全树,所有的叶节点为箱子,每个内部节点 v ,保存一个属性 : v.max,记录以该节点为根的所有叶节点中,最大的剩余容量。
因此当要放入物品 i 的时候,其容量为 v[i],那么针对tournament tree的根节点开始,如果 root->left_child.max >= v[i],那么递归给左子树去解决问题,放置物品 i ,否则递归到右子树。
当某个叶节点(箱子)放入物品 i 的时候,其 v.max 减去 v[i]。那么递归更新该叶节点的ancestor (祖先节点)。
可以看到,每次放置一个物品 i 的时候,其时间复杂度为 O(log n),因此总的时间复杂度为 O(n log n)。

FFD

降序首次适应(FFD)算法。上述的First Fit 是一种在线算法。即每次可以在线地直接接受物品 i 作为输入,然后根据一种策略放置物品 i 。而降序首次适应算法(FFD)则是离线地接收完所有的物品,对这些物品按体积从大到小进行排序。之后还是使用FF算法。复杂度同样,也是 O( n log n)。

装箱问题(NP问题)

标签:装箱   np   首次适应   

原文地址:http://blog.csdn.net/nisxiya/article/details/45533811

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!