Algorithm 快速排序是否存在潜在的安全风险?

Algorithm 快速排序是否存在潜在的安全风险?,algorithm,security,quicksort,Algorithm,Security,Quicksort,我只是想知道(在某些严重的偏执和特定情况下)在应用程序中使用快速排序算法是否会被视为一种安全风险 它的基本实现和改进版本(如3-median-quicksort)都具有对某些输入数据行为异常的特点,这意味着它们的运行时间在这些情况下会极大地增加(具有O(n^2)复杂性),更不用说堆栈溢出的可能性了 因此,我认为向程序提供预先排序的数据可能会造成危害,导致算法的行为类似于此,这可能会对多客户端web应用程序造成不可预测的后果 这个奇怪的案例是否值得任何安全考虑(因此会迫使我们改用Intro或Mer

我只是想知道(在某些严重的偏执和特定情况下)在应用程序中使用快速排序算法是否会被视为一种安全风险

它的基本实现和改进版本(如3-median-quicksort)都具有对某些输入数据行为异常的特点,这意味着它们的运行时间在这些情况下会极大地增加(具有
O(n^2)
复杂性),更不用说堆栈溢出的可能性了

因此,我认为向程序提供预先排序的数据可能会造成危害,导致算法的行为类似于此,这可能会对多客户端web应用程序造成不可预测的后果

这个奇怪的案例是否值得任何安全考虑(因此会迫使我们改用Intro或Mergesort)


编辑:我知道有一些方法可以防止Quicksort出现最坏的情况,但是语言集成排序(如.NET的3个中位数)又如何呢。它们会成为禁忌吗?

是的,这是一种安全风险——具体来说是DoS——通过在快速排序中添加递归深度检查,并在达到某个深度时切换到其他内容,可以很容易地减轻这种风险。如果您切换到heapsort,那么您将得到许多STL实现实际使用的结果


或者,您只需随机选择轴元素。

看看这个问题(以及标记的答案),其中讨论了减少快速排序最坏情况的方法:


许多快速排序的实现都是使用。这意味着无法使用巧尽心思构建的输入

此外,即使没有这一点,大多数数据集都太小,以至于没有O(nlog)与O(n^2)的关系。排序集的大小必须非常大才能产生影响。即使有几百万个元素,时差也不会很大


总的来说,使用快速排序的任何给定web应用程序都更有可能有其他应用程序。

如果性能很重要,那么在大多数情况下,无论是否出于安全考虑,快速排序似乎都是一个糟糕的选择。有没有什么东西会让你回避像Heapsort或Mergesort这样的算法?

我认为这在很大程度上是一个你在哪里实际使用快速排序的问题。例如,在处理5个项目的数组时,使用O(n^2)算法是非常好的。另一方面,当数据可能非常大时,担心DoS并不是你要面对的第一个问题——第一个问题是在你面对真正的问题之前性能会变得很差。考虑到大量其他可用的算法,如果它位于关键位置,就更换它。

是的,但只有在非常、非常不可能的情况下——所有这些都是正确设计的算法很容易避免的

但是如果你想变得超级安全,你可能想使用类似的东西,它一开始是快速排序,但如果它从递归深度检测到算法开始变为二次排序,就会切换到堆排序

编辑:我看到帕维尔打败了我


在回答编辑后的问题时:我并没有亲自测试过每一个快速排序库,但我确信几乎所有库都有检查以避免最坏的情况。

是的,在我第一年的CS课程中编写了它之后,但我从未建立过一个网站,允许用户上传一百万个元素的数据集供我使用任何算法进行排序。“在某些情况下”意味着这是剩下的最糟糕的情况,用户可以欺骗你做很多工作。在O(n^2)排序比网站处理用户发送给他们的数据(例如保存数据)更像是拒绝服务之前,他们必须向您发送大量数据。然后(只有到那时),我会考虑一个手工翻滚的内部排序,也许有一个安全优势比“构建”快速排序。PSST。快速排序不是指数排序,在最坏的情况下是O(n^2)。它们通常比快速排序的性能差吗?