- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈数据的合理组织
四川省绵阳南山中学 何森
【摘要】
信息学是一门高深的学科,它正在高速的发展。随着信息学的发展,其题目中的关系也变得越来越错宗复杂,给我们解题带来困难。对数据进行合理地组织,正是我们面对上述题目时的一种有效手段。
本文用几个经典例题从数据的结构和顺序两个方面进行合理组织,达到优化模型或是提升算法效率的目的。介绍了“合理组织数据”在信息学中建立模型和优化算法方面的一些应用,例题包含了动态规划、数据结构、图论类型的题目。目的在于引起读者对于数据的合理组织的关注,并在今后的解题中能积极并灵活地运用这一手段。
【关键字】
组织数据 数据结构 动态规划 图 树 序列
【正文】
【引言】
一个简单的例子:
给出N个数字(数字会比较大),然后给出一些询问,询问一个数字有没有在给出的N个数字当中。
当然我们有很多已知的办法:
HASH表、TRIE、预排序+二分查找……
这些算法都是通过对数据进行合理的组织而起到了减少工作量的作用。
不同的是HASH表和TRIE是利用数据形式的重新组织,而预排序+二分查找是通过对数据顺序的重新组织来达到优化算法的目的的。我们组织数据,主要就是通过从“形式”和“顺序”这两个角度来考虑。事实上,这两个方面在实际运用中往往不是独立的,通常需要联合运用。
我们已经学习了很多经典的数据结构,它们都是合理组织数据的表现。在优化算法中有很好表现。对数据组织的合理化,不仅在我们设计算法时能起到优化程序效率的作用,有时,我们在建立解题模型时,合理地组织数据可能给我们提供新的思考角度,从而优化解题模型,例一就是这样的一个例子。
[例一]金明的预算方案及其加强版
金明的预算方案
【题意描述】
给出N个物品,每个物品都有一个权值(50000)和一个价格(10000)。我们称可以直接被购买的物品为主件,称不能被直接购买的物品为附件,附件只有当其主件被购买了才能被购买,一个主件最多有两个附件,附件没有下一级附件。
任务 购买一些物品,总价格不超过M,使得被购买的物品的权值之和最大。
N3200 M60
【简要分析】
我们很容易联想到经典的动态规划之0-1背包问题。
但是题目与背包却有一些差别:附件不能被直接购买。
【对数据的初步组织】
主件与附件之间是树形的关系。组织一下数据,如下图:
(图1)
如图所示:
主件1没有附件,主件2有两个附件,主件3只有一个附件。
【数据组织方案一】
假设我们忽略数据的特殊性,单从树结构考虑,我们容易想到的一个算法是:
给所有主件加上一个“级超主件”,把原来的所有主件都变成“超级主件”的附件,如下图:
(图2)
【算法一】
这样,在这棵树上,我们可以设计一个动态规划算法:
定义:
cost[a]表示a节点所代表的物品的价格
score[a]表示a节点所代表的物品的得分
状态f[a][b]表示以节点a为根的子树,总共花费不超过b元的最多得分。
状态转移方程:
f[a][b]=Max{f[c1][b1]+f[c2][b2]+f[c3][b3]...f[ck][bk]}+score[a];
其中ci为a的子节点;∑bi=b-cost[a];
这样枚举的效率显然不高!
我们可以用左儿子右兄弟表示法来表示这一棵树,将原树转化成二叉树,则我们在进行状态转移的时候只用考虑给左儿子分配多少钱。
left[a]表示a的左儿子
right[a]表示a的右儿子
f[a][b]=Max{Max{f[left[a]][bleft]+f[right[a]][b-cost[a]-bleft]}+score[a],f[right[a]][b]}
这样我们可以得到一个理论复杂度为O(NM2)的算法,但是对于本题的数据范围来说,这个复杂度并不太理想。
【数据组织方案二】
上面我们把本题同0-1背包进行了类比。发现两道题之间的差别:附件不能被直接购买。显然,如果题目中没有附件,那么本题即为标准的01背包问题。
我们回到题目并考虑其特殊性:
1.附件没有附件。
2.每个主件最多只有2个附件。
这样,显然对于(图一)中每一组(主件+附件),可以作为整体考虑。
对于每一组,可能的购买方案最多只有:
1.什么都不买
2.只购买主件
3.购买主件和附件1
4.购买主件和附件2
5.购买主件和两个附件
这样,我们可以借鉴经典的01背包动态规划,把每一组看作一个对象,取值和花费对应最多五种。
【算法二】
cost[i][k]表示分组后第i个对象的第k种购买方案的花费。
weight[i][k]表示分组后第i个对象的第k种购买方案的总权值。
F[i][j]表示前i个对象最多花费j元,能得到的最大权值。
F[i][j]=max(F[i-1][j-cost[i][k]]+weight[i][k]);
其中1=k=5且cost[i][k]=
文档评论(0)