我一直在尋找通過的algorithms列表,並決定去看看find方法問題的理解背後的C++算法二進制搜索運作
查找方法
template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)
{
while (first!=last) {
if (*first==val) return first;
++first;
}
return last;
}
看來查找運行時間爲Big O(n),因爲它遍歷容器中的每個元素以查找值。
我的想法立刻想到Binary Search,我去看看它。
二進制搜索
template <class ForwardIterator, class T>
bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)
{
first = std::lower_bound(first,last,val);
return (first!=last && !(val<*first));
}
知道它利用另一個函數:lower bound,我繼續研究下界這返回指向範圍爲[第一的第一個元素的迭代器,最後),這不比val小。
這是我的分析
假設一個陣列
[1,4,7,10,12]
如果我們使用二進制搜索來搜索6,first
將等於一個迭代器指向7
*first
將是值1,val
將是值6然後 !(val<*first)
將是真實的
由於first!=last
==真& & !(val<*first)
==真 ,即使6不數組中存在
我知道有缺陷的二進制搜索功能將返回true。我的推理,可以有人向我解釋,我在哪裏 出錯?
如果'first'是一個指向7的迭代器,那麼'* first'似乎不太可能是值1 ...... –
'首先會等於指向7'的迭代器,而'* first將會是價值'是不相容的陳述。選擇一個你認爲是真實的,並從那裏繼續。 –
假設我查找了7而不是6,*首先是10因此!(val <* first)將是錯誤的,並且二進制搜索將返回false,儘管7存在於數組中,這個推理有什麼錯誤 – Computernerd