快速排序对抗性输入构造方法研究.pdfVIP

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

SOFTWARE—实践与经验,第29卷第0期,1–4(01999)

快速排序的一个级对手

M.D.MCILROY达特茅斯学院,汉

诺威,NH03755,

通过在运行时根据所比较的元素序列构造输入,可以使快速排序为二次时间复杂度。本文通过一个

针对C语言qsort函数的具体对手方法来说明这一技术。该通用方法适用于对抗任何快速排序的实现——

即使是随机化的实现——只要它满足某些非常轻微且现实的假设。

使用快速排序时,人们常常有一种挥之不去的紧张感:万一它成二次时间复杂度?

大多数算法书籍中都提到了一些策略来避免某些低熵情况(如已经有序的输入)导致的尴尬结果,

并且这些策略被广泛使用。尽管如此,在实际应用中还是出现过生产实现的快速排序为二次

时间的情况。无论实现者如何努力,他们也无法在不大幅牺牲速度的前提下防御所有可能的输入。

123

本文描述了一种对抗性方法,可以发现任何实现方案防御机制中的。

像C函数qsort这样的多态快速排序实现从不查看数据。它依赖于外部的比较函

数。而这使我们能够以非侵入式的方式并影响程序的执行。为此,我们设计了一个比较

函数,它可以观察比较的模式,并动态构造对抗性的数据。

回想一下,快速排序对n个数据项进行排序分为三个阶段:

1.选择一个数据项作为主元。我们假设此阶段使用O(1)次比较。2.将数据划分为三个部分,分

别包含所有小于主元的项、主元本身以及所有大于主元的项。对于等于主元的项的处理方

式,不同的实现可能有所不同。3.递归地对低位和部分进行排序。

对手可以通过安排主元,使其与在主元选择过程中未被比较的几乎所有项相比都偏小,

从而使得分区不平衡。这些项可以被看作是一种“气体”,它们之间的关系是未知的。只要

这些项之间不被相互比较,它们的具体值并不重要。由于n−O(1)个气体值必须在n个项中

进行主元选择时被保留下来,因此可以保证二次行为。几乎所有的分区都会偏高。

最初,对手将所有项设为气体。当两个气体项进行比较时,其中一个会“冻结”成一个确定

的“固体”值,且大于任何已经的值。然后操作数将重新进行比较。当一个固体项与一个气

体项比较时,它会被判定为较小。当两个固体项进行比较时,结果取决于它们的冻结值。

关键技巧是确保主元在划分阶段早期被冻结,如果它尚未被冻结的话。只要主元参与每

次比较,就不会有的气体项被冻结——也就是说,在整个划分阶段期间如此。

一个简单的启发式方法足以猜测主元并将其冻结。“候选主元”是一次比较中存的气体

项。当某个项被冻结(在气体‑气体比较中)时,优先选择候选主元。

CCC0038–0644/99/000001–041998年收到

c1999由约翰·威利父子公司1998年修订

SOFTWARE—PRACTICEANDEXPERIENCE,VOL.29(0),1–4(01999)

AKillerAdversaryforQuicksort

M.D.MCILROY

DartmouthCollege,Hanover,NH03755,

文档评论(0)

182****0328 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档