《BoneSort》解题报告.docVIP

  1. 1、本文档共3页,可阅读全部内容。
  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文档。上传文档
查看更多
《BoneSort》解题报告

树状数组的一个简单应用实例—— 《Bone Sort(ZJU1440)》解题报告 【原题描述】 【分析·Ⅰ】 该问题可以看作是两个由2部分子问题合并而成:分别是求一个未排序的序列需要经过多少次交换操作才能使序列升序有序,并且求出原序列中有多少个逆序对。 对于第一部分问题可以用一个简单的贪心完成,下面先直接地给出算法。 算法Part1 算法思想: 按照顺序扫描序列的每一位,如果此位尚未调整至升序要求则进行一次交换。 具体实现: 预处理:对原序列升序排序[复杂度O(NLog2N)]。 依次检查原序列的每一位[复杂度O(N)]: 判断该位置目前的值是否与排序后的等位的值相同 相同则继续检查下一位 否则将当前位置值与排序后等位的值所在的位置交换,更新交换次数 算法分析: 此部分算法的时间复杂度为O(NLog2N),此算法的证明是比较容易的,在此就不再赘述。 【分析·Ⅱ】 求逆序对的经典分治算法有大量相关资料记载,在此我们应用树状数组来解决这个问题。我们设想动态维护一个D(i)记录序列至目前为止小于等于i的数的数量。下面给出算法: 算法Part2 算法思想: 按照顺序扫描排位序列的每一位,统计在此之前出现的数中小于该数的数的数量,累加后得到整个序列中非逆序对的数量。用总序对的数量减去即可得到逆序对数量。 具体实现: 预处理:利用算法Part1中的排序结果计算出序列中各数字的排位序列(既原序列的等位数值在升序序列中的排位名次,以此减小数值范围)[复杂度O(N)]。 依次处理排位序列的每个位置的值[复杂度O(N)]: 计算序列此位置之前的元素中有多少个值小于它的[复杂度O(Log2N)]。 维护树状数组,将该元素加入。[复杂度O(Log2N)] 算法分析: 该算法的整体复杂度是O(NLog2N),因用树状数组可以作为线段树的一种特殊形式,即此问题的部分加强形式可以利用线段树更强的维护能力解决。因此该算法在解决该问题的变形上具有比该问题的分治算法有更强的可扩展性。 【小结】 “Every road leads to rome”,一个问题的解决往往可以采用多种方法。而各种的方法的存在都有它的理由,了解掌握各种方法的特点、适用范围,可以有助于我们更自如应用手里现有的算法,难道不是吗? 【附录】 算法源代码: 第 1 页 共 3 页

文档评论(0)

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

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

1亿VIP精品文档

相关文档