使用分而治之范式的算法实现

时间:2016-03-12 00:38:23

标签: algorithm recursion big-o time-complexity

我需要为此算法实现递归版本。作为递归的新手,我对如何处理这个问题有一个非常模糊的想法。

描述给定一组的Θ(n lg n)时间算法 n个整数的S,确定S中的哪两个元素 差别很小。

1 个答案:

答案 0 :(得分:2)

这可能会让你的生活变得更轻松的一个观察是认识到如果数字按顺序排序,那么差异最小的数字对必须彼此相邻。因此,一个简单的算法是对元素进行排序,然后查看所有相邻的对以找到最小的元素。

由于要求您递归执行此操作,您可能会尝试递归地解决每个部分。对于第一部分 - 排序 - 有一个 ton 良好的递归排序算法 - mergesort和quicksort来命名其中两个。 Mergesort在时间O(n log n)运行,因此这是一个很好的起点。

至于如何使用递归找到最佳对,这里有一些可以让你得到递归解决方案的见解:

  • 如果数组中只有两个元素,则它们必须具有最小的差异,因为没有任何其他选项。
  • 如果数组中有三个或更多元素,则最佳对使用第一个元素,或者不使用第一个元素。如果它确实使用第一对,则值由前两个元素给出。如果没有,那么你可以(递归地)通过查找除了第一个元素之外的子数组中最小差异的对来计算最佳元素对。

这种整体方法在时间O(n log n)内运行。我会将细节留作练习,因为这似乎是一个问题设定问题。