划分和征服算法以找到数组中的最小值

时间:2012-04-20 20:00:26

标签: arrays algorithm divide-and-conquer

一个数组a [1..n]的某些有序类型的元素(即x< y总是被定义),我想使用“分而治之”算法找到数组中的最小值。

作业究竟意味着什么?

6 个答案:

答案 0 :(得分:5)

分而治之是一种算法技术,它通过将问题分解为更小的部分,解决每个部分中的问题,并将结果组合在一起以形成整体答案来解决问题。当问题变得足够简单时,可以直接解决。

在这种情况下,请考虑如果将数组拆分成两半会发生什么。如果你知道每一半的最小值,你能算出总体的最小值吗?当数组中只剩下一个元素时,数组中的最小值是多少?如果你回答这个问题,你可以直接为这个问题提出一个递归的分而治之算法。

希望这有帮助!

答案 1 :(得分:1)

分而治之的策略解决了一个问题:

  1. 将其分解为子问题,这些子问题本身就是相同类型的较小实例 问题

  2. 递归解决这些子问题

  3. 妥善结合答案

  4. 一个很好的例子是merge-sort!

    http://en.wikipedia.org/wiki/Merge_sort

答案 2 :(得分:0)

  1. 如果数组的内容是随机的,那意味着您必须搜索每个元素,直到找到您要查找的元素。数组越长,搜索时间越长。这称为“linear search”。

  2. 如果数组的内容已经按某种顺序排列,您可以利用此顺序优化搜索(并缩短搜索时间)。例如,电话簿中的名称按字母顺序排序。您可以在中间打开电话簿:如果您要查找的名称“低于”中间的名称,则继续在书的左侧搜索。如果它更高,则搜索右半部分。这被称为“binary search”或“分而治之”。

  3. 可以量化给定搜索算法的效率或效率。这称为“Asymptotic”或“Big O-Notation”:

  4.     
        Class                         Search algorithm
        -----                         ----------------
        Data structure                Array
        Worst case performance        O(log n)
        Best case performance         O(1)
        Average case performance      O(log n)
        Worst case space complexity   O(1)

答案 3 :(得分:0)

一般来说,“分而治之”意味着将问题分解为更小(通常更简单)的问题,分别解决每个问题,然后以某种方式组合解决方案。

在您的具体示例中,您应该以某种方式将数组划分为更小的数组(例如,将其除以一半),找到每个较小数组中的最小值,然后选择这些子问题的最小解。解决整体问题。每个子问题都可以使用相同的分而治之的方法来解决,限制情况是一个足够小的数组(例如,1或2),您可以直接解决问题。

答案 4 :(得分:0)

你可以使用以下算法。

getSmallest(int a[])
{
  int n=a.length;
  if(n==1)
    return a[0];
  else
   {
        x=remove first element from a;
        create another array b with a size smaller by 1 than array a
        if(x<getSmallest(b))
            return x;
        else
           return the smallest returned by the recursive call 
   }
}

答案 5 :(得分:0)