考虑递归算法的比较次数

时间:2014-03-09 06:11:26

标签: algorithm sorting comparison time-complexity

在(大多数)关于排序的研究论文中,作者得出结论,他们的算法需要n-1比较来排序'n'大小的数组(其中n是数组的大小) ...谁谁 但是当涉及到编码时,代码使用了比结论更多的比较。 更具体地说,他们对比较做了什么假设?

他们没有考虑什么样的比较?

如果你看一下冻结排序或增强插入排序就好了。没有。在比较中,这些算法在实际代码中的含量超过了它们在图中所指定的数量(比较数和元素数)

2 个答案:

答案 0 :(得分:1)

在排序算法中完成的最少可能的次数比较可以是n-1。在这种情况下,您根本不会实际排序,您只需要检查数据是否已经排序,基本上只是将每个元素与它之前和之后的元素进行比较(这在{的最佳情况下完成) {3}})。很容易看出不可能做比这更少的比较,因为那时你有不止一个不相交的你所比较的集合,这意味着你不会知道这些集合中的元素如何相互比较。

如果我们谈论的是平均/最差情况,insertion sort所需的比较次数为Ω(n log n)。

递归或迭代的算法不会(直接)影响比较次数。我认为我们可以专门针对递归排序算法的唯一声明可能是递归深度。这在很大程度上取决于算法,但it's actually been proven具有n-1附近的(最坏情况)递归深度。

答案 1 :(得分:0)

  1. 通常在论文中忽略但进行的更多比较 在实际代码中是分支的比较。 (if (<stop clause>) return ...;),类似于循环迭代器。
    • 他们被忽略的一个原因是他们完成了 具有恒定大小的索引,而比较的元素 (我们算得上) - 可能需要更多时间,具体取决于实际情况 被比较的类型(字符串可能需要更长的时间来比较 整数,例如)。
  2. 另请注意,无法使用n-1比较对数组进行排序 (最差/平均情况),因为排序是Omega(nlogn)问题。 但是,authour的意思是排序需要 n-1在算法的每个步骤进行比较,并且可能存在 多个(通常O(logn))这些步骤。