分而治之算法,用于查找数组中的最小值



某个有序类型的元素的数组 a[1..n](即始终定义 x <y),我想使用"分而治之"算法找到数组中的最小值。>

作业的真正含义是什么?

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

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

希望这有帮助!

分而治之策略通过以下方式解决问题:

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

  2. 递归求解这些子问题

  3. 适当地结合他们的答案

一个很好的例子是合并排序!

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

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

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

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

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

  3. 可以量化给定搜索算法的效率或低效程度。这称为"渐近"或"大O符号":

      类搜索算法    -----                         ----------------    数据结构数组    最坏情况性能 O(log n)    最佳情况性能 O(1)    平均案例表现 O(log n)    最坏情况下空间复杂度 O(1)

您可以使用以下算法。

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 
   }
}

> http://ankzcode.blogspot.in/2012/11/find-minimum-without-linear-search.html

链接处的代码实现相同的内容。

最新更新