网站大量收购独家精品文档,联系QQ:2885784924

国家集训队2005-论文集 何林.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
国家集训队2005-论文集 何林

数据关系的简化 长沙雅礼中学 何林 摘要 数据之间的关系有着和数据本身同等的重要性。最常见的数据关系有线性关系、树关系和图关系。信息学竞赛的本质就是对数据的充分挖掘。然后有时候挖掘太过充分,反而会把问题复杂化。本来将讨论的就是如何通过适当的简化数据关系,实现数据的合理挖掘。 关键字 树,图,序列,数据关系 引言 我们经常面对大量的数据,但是他们之间不是杂乱无章的。一些用道路连接的城市表现出来的数据关系是图;一些行政部门的上司下属关系表现出来的是树关系;学校的成绩排名表现出来的数据关系是线性关系。 图、树和线性关系是我们在生活中、也是在信息学竞赛中遇到的三种最常见的关系。虽然信息学竞赛强调对输入信息的充分挖掘和应用,但有时候关系过于复杂反而让人眼花缭乱。本文就是要介绍一种重要的思想:简化数据结构。具体的说可以把图简化成树、把树简化成线性结构。这看起来不可思议,因为在简化的过程中必然会丢失一些信息,但是通过本文接下来的分析和举证,你又会发现这是切实可行的一种思想。 简化图关系 先来看一个题目: 坐船问题 雅礼中学有n个学生去公园划船。一条船最多可以坐两个人。如果某两个学生同姓或者同名就可以坐在一条船上。 学校希望每个同学都坐上船,但是小船的租用费用很高,学校想要租用最少的船。请问:学校至少要租多少船? 我们可以把每个学生看作一个顶点。如果两个学生同姓,就在两者之间连一条红边;如果他们同名,就在两者之间连一条蓝边。 这样我们就把问题的全部信息都毫无遗漏的包含在这个图里面了。剩下的问题就是求一个最小边覆盖,实际上也就是求最大匹配。 这个图并不一定是二分图,所以求最大匹配涉及到带花树,十分复杂。有没有更好的方法呢? 首先假设这个图是连通的。 下面我们用一棵树来表示这个图。这是一颗二叉树。每个节点的左儿子(如果存在)和它同姓,右儿子(如果存在)和它同名。 构树算法如下: 假设树中已经含有k个点了。如果k=n,那么构造算法结束。否则因为整个图是连通的,剩下的点中至少有一个和当前的树连通。不妨设剩下的某个点P和树中的一个点T之间有边。 第一种情况是P和T同姓。沿着T的左儿子不断的“往左”走,直到到达某一个点X无法继续前进(也就是X没有左儿子)。因为X和T同姓,所以它也必然和P同姓;同时X没有左儿子,令P为X的左儿子即可。这样树的规模就增大了1。 第二种情况是P和T同名。和第一种情况类似。 于是我们总是可以把树的规模增大1,直到把所有的点都包含到树中。 构造出这样一棵树有什么好处呢?下面考虑任意一个叶子节点P,设它的父亲是F。 如果P是F的唯一孩子,那么令P和F坐一条船。树的规模就减小了2。否则F有两个孩子,设另一个孩子是Q。为了方便讨论,不妨设P是F的左儿子,Q是F的右儿子。 第一种情况:F是根节点。 这时候总共有三个学生还没坐船。至少要两条船。令F和P坐一条船,Q坐一条船即可。 第二种情况:F是它父亲的左儿子。设F的父亲是F’。 令F和Q坐一条船。然后把F和Q从树中删除。此时P的左儿子P落了单。因为F和F’同姓,F又和P同姓,所以F’和P同姓。令P为F’的左儿子即可。这就保证了树的连通性。 第三种情况:F是它父亲的右儿子。 和第二种情况类似。见上图。 通过以上算法,可以不断的把树的规模减小。如果树有n个节点,那么最后的结果就是需要条船。毫无疑问这是最优解。 如果图不连通,那么把每个连通图按照上述算法分别处理,最后把船数相加即可。 整个算法的复杂度是O(n),不仅效率上大大优于匹配算法,而且两者的编程复杂度更是不能同日而语。 这个题目的数据是学生,数据关系是同姓或者同名。毫无疑问,用图来表示学生之间的关系是很自然的想法,而且图也的确可以毫无遗漏的把所有信息包含进去。但是正因为图的包罗万象,使得我们束手无策。虽然存在匹配算法,但是它不仅思维、编程复杂度高,而且效率也不尽人意。 在思维的路上转一个弯,我们用一棵二叉树来表现数据关系。尽管有些人之间的信息被忽略了,比如根节点和某个叶子节点可能同姓或者同名、而在树中他们两者之间也许没有直接关联的边;我们反而能够更加有效率的应用这些简化后的数据关系解题。 可见数据和数据关系的利用也不是越充分越好,有时候合理的运用更有效。 下面我们再来看一个例子。 仙人掌图的判定 如果一个有向图: 它是一个强连通图。 它的任意一条边都属于且仅属于一个环。 这个图就称为仙人掌图。 输入一个n个节点,m条边的图(1=n,m=105),请判断它是不是仙人掌图。 为了对仙人掌图有一个感性认识,我们先看下面三个图。 其中a)和c)都不是仙人掌图,因为a)不是强连通的、c)中的红弧同时属于两个圈1(2(3(4(1和1(2(4(1。 b)就是一个仙人掌。直观的说,仙人掌图就是一个一个的圈直接“粘”在一起的图,圈之间没有公共边。 于是我

文档评论(0)

317960162 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档