用于查找数组中最小值的分治算法
Posted
技术标签:
【中文标题】用于查找数组中最小值的分治算法【英文标题】:Divide and conquer algorithm for finding the smallest value in the array 【发布时间】:2012-05-02 10:12:10 【问题描述】:某个有序类型元素的数组 a[1..n](即 x
作业的真正含义是什么?
【问题讨论】:
这意味着您应该实现“分而治之”算法(可能是递归算法)——将问题分解成越来越小的部分,直到找到解决方案(@ 987654321@)。数组定义a[1..n]
只是说有一个数组,其中有 n 个元素,可以排序。
【参考方案1】:
分而治之是一种算法技术,它通过将问题拆分为更小的部分、在每个部分中解决问题并将结果组合在一起形成一个整体答案来解决问题。当问题变得足够简单时,就可以直接解决了。
在这种情况下,想想如果将数组分成两半会发生什么。如果你知道每一半的最小值,你能算出整体的最小值吗?当数组中只剩下一个元素时,数组中的最小值是多少?如果你回答了这个问题,你就可以直接想出一个递归的分治算法来解决这个问题。
希望这会有所帮助!
【讨论】:
我知道分而治之的意思...但是数组 a[1..n] 的某些有序类型(即 x @user1253637- 啊,对不起!我误解了你的问题。是的,这意味着它是一个未排序的元素数组。您不知道这些元素是什么(字符串、整数、小部件等),但任何两个元素都是可比较的,因此找到最小值是有意义的。您可能想澄清您的问题,因为似乎每个人都误解了您的要求。 :-) 表示未排序的列表,但是定义了 x分而治之的策略通过以下方式解决问题:
将其分解为子问题,这些子问题本身就是相同类型的较小实例 问题
递归解决这些子问题
适当组合他们的答案
一个很好的例子是归并排序!
http://en.wikipedia.org/wiki/Merge_sort
【讨论】:
为这个问题建议合并排序很奇怪。寻找最小元素是 O(n) 线性扫描;合并排序是 O(n log n)。 @TedHopp 是的,但是合并排序确实分而治之【参考方案3】:一般来说,“分而治之”是指将一个问题分成更小(通常更简单)的问题,分别解决每个问题,然后以某种方式组合解决方案。
在您的具体示例中,您应该以某种方式将数组分成较小的数组(例如,将其分成两半),找到每个较小数组中的最小值,然后选择这些子问题的最小解作为解决整体问题。每个子问题都可以使用相同的分而治之的方法来解决,限制情况是您可以直接解决问题的足够小尺寸(例如 1 或 2)的数组。
【讨论】:
【参考方案4】:如果数组的内容是随机的,这意味着您必须搜索每个元素,直到找到您要查找的元素。数组越长,搜索时间越长。这称为“linear search”。
如果数组的内容已经按某种顺序排列,您可以利用这种顺序来优化搜索(并减少搜索时间)。例如,电话簿中的姓名按字母顺序排序。您可以打开中间的电话簿:如果您要查找的名字“低于”中间的名字,则在电话簿的左侧继续搜索。如果它更高,则搜索右半部分。这称为“binary search”或“分而治之”。
可以量化给定搜索算法的效率或低效率。这称为“Asymptotic”或“Big O-Notation”:
【讨论】:
【参考方案5】:你可以使用以下算法。
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
【讨论】:
【参考方案6】:http://ankzcode.blogspot.in/2012/11/find-minimum-without-linear-search.html
链接中的代码实现相同。
【讨论】:
以上是关于用于查找数组中最小值的分治算法的主要内容,如果未能解决你的问题,请参考以下文章