解释算法实验的结果?

时间:2012-03-02 17:29:16

标签: algorithm big-o

我有一个快速排序算法和一个计数器,每次执行比较或交换时我都会递增。以下是我对不同大小的随机整数数组的结果 -

Array size --- number of operations

10000 --- 238393

20000 --- 511260

40000 --- 1120512

80000 --- 2370145

编辑:

我已删除了我在这篇文章中提出的错误问题。我实际要问的是 -

我试图找出的是'这些结果是否与快速排序的理论复杂性叠加(O(N * log(N)))?

2 个答案:

答案 0 :(得分:3)

  

现在,基本上我需要知道的是如何解释这些结果   所以我可以确定QuickSort的Big Oh复杂性?

根据定义,通过考虑任何(有限的)输入和外推的行为,不可能确定算法的渐近复杂性。

如果你想尝试,你应该做的是你在任何科学中所做的事情:查看数据,提出一个假设(例如,“这些数据用曲线近似......”)然后尝试反驳它(例如通过检查更多数字)。如果你不能通过旨在反驳它的进一步实验来反驳这个假设,那么它就可以成立。你永远不会真正知道你是否使用这种方法是正确的,但是再一次,所有经验科学都是如此。

正如其他人所指出的那样,首选(这是一种轻描淡写;普遍接受并且唯一可接受的可能是更好的措辞)确定算法的渐近界限的方法是,以数学方式对其进行分析,并产生证明它服从了界限。

编辑:

这忽略了将曲线拟合到数据中的复杂性,以及设计有效实验很难做到的事实。我假设你知道如何拟合曲线(这里与其他任何数据分析没有什么不同......你只需要知道你在寻找什么以及如何看待)并且你已经设计了这样的实验(a)你可以回答你想回答的问题,以及(b)你得到的答案会有某种有效性。这些都是单独的问题,需要几年的正规教育和培训才能开始正确使用和理解。

答案 1 :(得分:1)

虽然你只能通过实验来获得方法的渐近界限,但有时你可以通过绘制类似于你的函数的复杂性图表来评估它的行为,并查看行为。

您可以通过绘制某些函数y = f(n)的图表来执行此操作,以便f(10000) ~= g(10000) [其中g是您的函数],并检查行为差异。

在您的示例中,我们得到以下图表:

graph

我们可以清楚地看到:

  1. 结果的行为是次级二次
  2. 行为高于线性。
  3. 它非常接近对数行为,但只是有点“更高”。
  4. 由此,我们可以推断出您的算法可能 O(n^2) [不严格!记住,大O不是一个严格的界限],也可能是O(nlogn),如果我们推断出O(nlogn)函数的差异是一个噪音。

    注意:

    1. 此方法证明了该算法,特别是 并没有给你任何最坏的情况[甚至平均情况]约束。
    2. 此方法通常用于评估两个算法,而不是一些预先定义的函数,以检查哪个更适合哪些输入。
    3. 修改
      我将所有图形都绘制为y1(x) = f(x)y2(x) = g(x),...因为我发现这种方式更容易解释,但通常在比较两种算法时[因为你经常使用这种方法],函数是y(x) = f(x) / g(x),你检查y(x)是否接近1,正在增长,缩小?