【0】README

0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 “近似装箱问题(三种联机算法实现)” 的idea 并用源代码加以实现;
0.2) 近似装箱问题的三种联机算法 分别是: 下项适合算法 + 首次适合算法 + 最佳适合算法 , 我们将依次给出源代码实现+算法描述;
0.2)联机问题+脱机问题

  • version1)联机装箱问题: 在这种问题中, 必须将每一件物品放入一个箱子后才处理下一件物品;(英语口语考试, 做完上一题,才能进入下一题作答)
  • version2)脱机装箱问题:在一个脱机装箱算法中, 我们做任何事情 都需要等到所有的输入数据全被读入后才进行;(一般的考试,你只需要在规定的时间做完题目即可,做题顺序不是我们所关心的)

【1】近似装箱问题

1.1)问题描述: 给定N 项物品, 大小为 s1, s2, ..., sN, 所有的大小都满足 0 < si < = 1 ;问题是要把这些物品装到最小数目的箱子中去, 已知每个箱子的容量是1个单位;下图显示的是 对N项物品的最优装箱方法;

1.2)有两种版本的装箱问题:

  • version1)联机装箱问题: 在这种问题中, 必须将每一件物品放入一个箱子后才处理下一件物品;(英语口语考试, 做完上一题,才能进入下一题作答)
  • version2)脱机装箱问题:在一个脱机装箱算法中, 我们做任何事情 都需要等到所有的输入数据全被读入后才进行;(一般的考试,你只需要在规定的时间做完题目即可,做题顺序不是我们所关心的)

1.3)联机算法

  • 1.3.1)要考虑的第一个问题是: 一个联机算法即使在允许无限计算的情况下是否实际上总能给出最优的解答;我们知道, 即使允许无限计算, 联机算法也必须先放入一项物品然后才能处理下一件物品并且不能改变决定
  • 1.3.2)我们可以证明:联机算法不总能够给出最优解;

【2】下项适合算法

2.1)算法描述: 当处理任一物品时, 我们检查看他是否还能装进刚刚装进物品的同一个箱子中去。 如果能够装进去, 那么就把它装入该箱子中, 否则,就开辟一个新箱子;
2.2)看个荔枝:

2.3)source code + printing results

  • 2.3.1)download source code: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter10/p271_nextFit
  • 2.3.2)source code at a glance:(for complete code , please click the given link above)
void nextfix(double key, int* index)
{int i;ElementTypePtr box;ElementTypePtr temp;box = buildSingleElement();box->key = key; // build single box with key overi = *index;for(; i<size; i++){if(surplus[i] < key)continue;temp = boxes[i] ;while(temp->next)                   temp = temp->next;temp->next = box;surplus[i] -= key;break;}*index = i;
}
  • 2.3.3)printing results:

【3】首次适合算法

3.0)出现的问题:虽然下项算法有一个合理的性能保证,但是,它的效果在实践中是很差的,因为在不需要开辟新箱子的时候它却开辟了新箱子;
3.1)算法描述:首次适合算法的策略是 依序扫描这些箱子但吧新的一项物品放入足够盛下它的第一个箱子中。因此,只有当先前放置物品的结果已经没有再容得下当前物品余地的时候, 我们才开辟一个新箱子;(一句话, 这里是从头到尾扫描箱子)
3.2)看个荔枝:

3.3)可以断言:首次适合算法保证其解最多包含最优装箱数的二倍;因为在任一时刻最多有一个箱子其空出的部分大于箱子的一半,因为若有第二个这样的箱子, 则它装的物品就会装到第一个这样的箱子中了;
3.4)source code + printing results

  • 3.4.1)download source code: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter10/p272_firstFit
  • 3.4.2)source code at a glance:(for complete code , please click the given link above)
void firstFix(double key)
{int i;ElementTypePtr box;ElementTypePtr temp;box = buildSingleElement();box->key = key; // build single box with key overfor(i=0; i<size; i++){if(surplus[i] < key)continue;temp = boxes[i] ;while(temp->next)                   temp = temp->next;temp->next = box;surplus[i] -= key;break;}
}
  • 3.4.3)printing results:

【4】最佳适合算法

4.1)算法描述:该方法不是吧一项新物品放入所发现的第一个能够容纳它的箱子, 而是放到所有箱子中能够容纳它的最满的箱子中;
4.2)看个荔枝:

Attention)

  • A1)大小为0.3 的项不是放在B2 而是放在了B3, 此时它正好把B3填满;
  • A2)当需要O(NlogN)的时候, 该算法对随机的输入表现得很好;

4.3)source code + printing results

  • 2.1)download source code: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter10/p273_bestFit
  • 2.2)source code at a glance:(for complete code , please click the given link above)
void bestFix(double key)
{int i;ElementTypePtr box;ElementTypePtr temp;double minimum;int miniIndex;box = buildSingleElement();box->key = key; // build single box with key overminiIndex = 0;minimum = 1.0;for(i=0; i<size; i++){if(surplus[i] < key)continue;if(surplus[i] - key < minimum){minimum = surplus[i] - key;miniIndex = i;}}temp = boxes[miniIndex] ;while(temp->next)                   temp = temp->next;temp->next = box;surplus[miniIndex] -= key;
}
  • 2.3)printing results:

转载于:https://www.cnblogs.com/pacoson/p/5005289.html

近似装箱问题(三种联机算法实现)相关推荐

  1. python 三种聚类算法(K-means,AGNES,DBScan)

    python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan) 更新时间:2019年06月27日 14:44:44   作者:weixin_42134141 这篇文章主要介绍了pyth ...

  2. 三种Hash算法对比以及秒传原理.

    三种Hash算法对比以及秒传原理 CRC (32/64)   MD5  Sha1 分5个点来说 1.校验值长度 2.校验值类别 3.安全级别 4.应用场景 1).校验值长度 CRC(32/64) 分别 ...

  3. 常用的三种线性模型算法--线性回归模型、岭回归模型、套索回归模型

    常用的三种线性模型算法–线性回归模型.岭回归模型.套索回归模型 线性模型基本概念 线性模型的一般预测模型是下面这个样子的,一般有多个变量,也可以称为多个特征x1.x2.x3 - 最简单的线性模型就是一 ...

  4. Xdelta3 bsdiff Courgette三种差分算法比较

    今天介绍常用的三种差分算法,分别是Xdelta3 bsdiff Courgette. Xdelta3 官网地址: http://xdelta.org 源码地址:https://github.com/j ...

  5. 20172328 蓝墨云实验——三种查找算法练习

    20172328 蓝墨云实验--三种查找算法练习 课程:<软件结构与数据结构> 班级: 1723 姓名: 李馨雨 学号:20172328 实验教师:王志强老师 实验日期:2018年10月1 ...

  6. 直立车模控制中三种滤波算法简单分析(清华卓晴)

    摘自:https://mp.weixin.qq.com/s/WbCh0NFAnsf9y2blQenf7g 让我想起余义的一篇文章也是说到平衡车有三种滤波,我想和卓晴说的是一样的吧. https://b ...

  7. 谱估计matlab,利用MATLAB工具箱比较三种谱估计算法

    总第175期2009年第1期 舰船电子工程 Ship Electr onic Engineering V o l.29No.1 96 利用MATLAB工具箱比较三种谱估计算法* 盖明明1)郗海龙2)姜 ...

  8. 【JVM】四种GC算法(分代收集+三种标记算法)

    目录 参考文章 四种GC算法 分代收集算法(理论) 标记清除算法 标记整理算法 标记复制算法 三种算法的优缺点 参考文章 JVM的4种垃圾回收算法.垃圾回收机制与总结_我是guyue,guyue就是我 ...

  9. 基于内容的推荐java代码_三种推荐算法简介:基于用户的协同过滤、基于物品的协同过滤、基于内容的推荐...

    1.推荐算法 1.1.协同过滤 协同过滤是目前应用最广泛的推荐算法,它仅仅通过了解用户与物品之间的关系进行推荐,而根本不会考虑到物品本身的属性. 可分成两类: 1.基于用户(user-based)的协 ...

最新文章

  1. 第一章--最小的“操作系统”
  2. CAD2009软件安装资料及教程
  3. AVPlayer 之avcore模块
  4. String 转 const char*
  5. sh密码登录mysql_Shell下实现免密码快速登陆MySQL数据库的方法
  6. VIM使用系列:转换文本大小写
  7. USB Mass Storage
  8. 《谈谈认同》这个文章有点晦涩 写的不太好
  9. Eclipse-project 重命名问题(如何彻底修改Eclipse工程名),4种解法
  10. Redis常用数据类型介绍、使用场景及其操作命令
  11. html js 跳出框架,现在的web框架为什么把html和js又结合在一起了?
  12. html+css前端面试题(一)
  13. 知了课堂Day3——微信小程序基础03——组件的一些笔记
  14. 生成专题2 | 图像生成评价指标FID
  15. 犹太人成功和浪漫的秘诀(.html)
  16. mac 卸载pkg安装包
  17. java程序员培训学习需要多长时间
  18. 如何提升自身能力?不再平庸
  19. java jdk v1.6_jdk1.6 64位
  20. 协同过滤系统基于用户的评分预测

热门文章

  1. 机器人或抢走2000万人“饭碗”
  2. vc6.0注释功能的脚本快捷键设置代码
  3. axure删除的页面怎么恢复_Axure如何应对意外关闭
  4. 013_Redis的主从模式
  5. matlab考试湖北理工学院,电子信息工程导论课程教学大纲-电气与电子信息工程学院-湖北.DOC...
  6. 算术运算符举例java_Java的算术运算符简介
  7. Java基础:面向对象
  8. windoes硬盘备份(数据迁移)的方法
  9. spring boot 邮件端口_1 分钟教会你用 Spring Boot 发邮件
  10. android后台文件下载库,android中如何下载文件并显示下载进度