據我所知,這種算法會在需要時正確搜索並變爲真。在課堂上,我們談論的是大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