给定已排序的数组,如果数组 A 包含元素 A[i] 使得 A[i] = i (递归和分而治之),则返回索引 i

Posted

技术标签:

【中文标题】给定已排序的数组,如果数组 A 包含元素 A[i] 使得 A[i] = i (递归和分而治之),则返回索引 i【英文标题】:Given sorted Array, Returns index i if array A contains an element A[i] such that A[i] = i (recursive and divide and conquer) 【发布时间】:2020-05-27 08:02:57 【问题描述】:

所以我有作业要做一个递归方法,该方法使用分治算法来搜索排序数组并检查 A[i] == i 是否(如果值与数组的当前索引匹配)。现在我不明白为什么我们会使用分而治之的算法,因为不是在寻找特定的值。

在我的脑海中(我是一个初学者)我只想做一个线性递归方法。给定长度为 n 的数组 A...

    if(n<0)
return -1;

if(A[n] == n)
return n;

else
return recursiveMethod(Array A, n-1);

这就是我的想法,但我不知道为什么我们要使用分而治之的算法。无论如何,如果有人可以用外行的方式解释,因为我是新手,我将不胜感激,谢谢

【问题讨论】:

【参考方案1】:

感谢您承认这是一个家庭作业问题 :)。人们不太可能为您完全回答它,但他们通常很有趣,以至于人们无法避免评论。如果您注意格式和清晰正确的语言等细节,您总会得到更好的答案。例如,如果您包含函数定义 (function recursiveMethod(Array a, Integer start) ) 并缩进函数体,您的代码会更容易理解。

现在让我们来解决这个问题:您的函数需要对大小为 n 的数组进行精确的 n 比较(我想您已经知道这部分了,它是 线性函数 中的线性,也是 O (n))。

我们可以做得更好吗?

要解决此类问题,请尝试成为一种惰性算法,始终寻找不需要完成的工作。在这里,我们可以利用数组排序的事实来推理我们可以跳过的工作:当A[i] &gt; i 时,所有值j = i..A[i] 也必须满足A[j] &gt; j。这是假设 A 可能包含重复值。如果 A 中的所有值都必须是不同的,那么您可以排除比我上面所做的更多...

【讨论】:

以上是关于给定已排序的数组,如果数组 A 包含元素 A[i] 使得 A[i] = i (递归和分而治之),则返回索引 i的主要内容,如果未能解决你的问题,请参考以下文章

给一已经排序数组A和x,求A中是否包含两个元素之和为x

c语言如何实现-数组排序,二分查找

AcWing 800. 数组元素的目标和

在一个已排序的数组里如何插入新数据项?

逆序对 (树状数组 | | 归并排序

acwing_800_数组元素的目标和