我已阅读快速排序。我们使用pivot元素而不管数组中的其他数据集。我所知道的;这个杀手对手告诉输入导致二次时间复杂度(实际上)。但是如何?
编辑:快速排序对手杀手published paper的以下几行不明白。
“最初对手使所有物品都燃气。当两个燃气项目进行比较时,一个被”冻结“进入 一个明确的“固体”值,大于任何已经固定的值。然后重新比较操作数。 当一个固体项目与一个燃气项目进行比较时,它会比较低。当比较两个固体项目时, 答案取决于冻结值。“
答案 0 :(得分:1)
将“gas”和“solid”视为对手应用于数组项目的标签,以便记住quicksort已经看到哪些项目。对手的工作原理如下:
该程序的设计使得只有在快速排序尚未移动的情况下才能冻结项目。因此,如果我们在所有项目都是实体的情况下取出它们,按照原始顺序排列它们,并在没有对手的情况下快速进入,快速排序将使用与对手存在时完全相同的比较序列。
答案 1 :(得分:1)
本文假设对手方面具有异常能力:对手控制quicksort
调用的比较函数。换句话说,攻击者不仅可以在开始时提供恶意制作的数据数组,还可以在quicksort
运行期间调整其行为。
鉴于这种力量,对手可以有效地构建一个即时的输入阵列' (由quicksort
观察),其中每个枢轴的选择值都高于之前观察到的所有元素。这样,选择n
个枢轴,并将每个枢轴与O(n)
个元素进行比较,产生O(n^2)
的运行时间。
'在飞行中'功能允许也打破quicksort
的随机版本。但是,除非您提供攻击者同时提供输入和比较方法的在线排序服务,否则您不必担心此攻击。