据我所知,这种算法会在需要时正确搜索并变为真。在课堂上,我们谈论的是大O分析,所以这个任务是展示递归搜索如何比迭代搜索更快。重点是搜索一个数字,使得A [i] = i(找到一个与存储在索引处的数字相同的索引)。该算法与迭代算法相差仅约100纳秒,但有时迭代速度更快。我使用rand()函数设置主要矢量。我运行这两种算法一百万次并记录时间。我问的问题是,这个算法是否尽可能高效,或者有更好的方法来做到这一点?有没有更高效的方法来做这个算法?
bool recursiveSearch(vector<int> &myList, int beginning, int end)
{
int mid = (beginning + end)/2;
if (myList[beginning] == beginning) //check if the vector at "beginning" is
{ //equal to the value of "beginning"
return true;
}
else if (beginning == end) //when this is true, the recursive loop ends.
{ //when passed into the method: end = size - 1
return false;
}
else
{
return (recursiveSearch(myList, beginning, mid) || recursiveSearch(myList, mid + 1, end));
}
}
编辑:在传递之前,该列表预有序和一个检测在主做是为了确保开头和结尾都存在
对于大O分析,无论您检查元素的顺序如何:线性(迭代)还是跳跃(递归),在未排序数组中查找值的最佳方式为“O(n)”同样好。但是,实际运行时间可能会有很大差异。通常你不关心这些微小的差异(时间上,也就是说,速度可能快1.5倍,但如果差距是100ns,谁在乎?),然而(你总是可以购买更快的机器;-)) 。 –
我担心时差的唯一原因是因为我的教授想证明这一点。这两种算法在我的机器上相差大约7微秒(在对我的向量的参考之后),实际上这并不重要,但它的任务说 – user2908474
@ user2908474你不能着手“证明” 。你运行实验,并报告你的发现。虽然两种算法都是O(N),但理论上,递归有更多的开销WRT迭代。另一方面,C和C++编译器非常擅长将递归代码优化为迭代代码。因此,在不同的优化级别上查看这两种方法产生的汇编代码可能是值得的。 – juanchopanza