递归与分治——二分查找算法(折半查找算法)
二分搜索主要解決的問題是確定排序后的數組中是否包含目標元素val。
二分搜索通過持續跟蹤數組中包含元素val的范圍。分為兩個過程,第一就是找到了,第二個就是沒找到;
一開始,這個范圍是整個數組,然后通過將val與數組中的中間項進行比較并拋棄一半的范圍來縮小范圍。該過程持續進行。
1、非遞歸算法
編寫代碼需要注意:
1.循環退出條件注意是left <= right
2.mid 的取值:
注意本代碼沒有寫成mid = (left + right) / 2 ,原因是如果 left 和 right 比較大的話,兩者之和就有可能會溢出。具我所知,如果要將性能優化到極致的話,我們可以將這里的除以 2 操作轉化成位運算 low+((high-low)>>1),因為相比除法運算來說,計算機處理位運算要快得多。但是本人平常編程基本不用左移右移運算符。
3.left 和 right 的更新
left = mid + 1,rigth = mid - 1。注意這里是 +1 和 -1,即mid位不再參與查詢。如果直接寫成 low=mid 或者 high=mid,就可能會發生死循環。比如,當 high = mid = low != val 時,就會導致一直循環不退出。
2、遞歸算法
//遞歸算法 int BinSearch(const vector<int>& ar, int left, int right, int val) {if (left < right){int mid = (right - left) / 2 + left;if (ar[mid] == val) return mid;else if (ar[mid] > val)return BinSearch(ar, left, mid - 1, val); elsereturn BinSearch(ar, mid + 1, right, val); }return -1; }二分查找算法的局限性:
1、二分查找法依賴的是順序表結構。因為二分查找方法需要按照下標隨機訪問元素。
2、二分查找針對的是有序數據。所以二分查找只能在插入、刪除操作不頻繁,一次排序多次查找的場景中。
3、二分查找依賴于順序存儲結構,要求內存空間連續,如果數據量太過大的情況下,可能存在空間不夠分配的困難。
總結
以上是生活随笔為你收集整理的递归与分治——二分查找算法(折半查找算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 递归与分治——斐波那契数列非递归,递归,
- 下一篇: 排序算法——快速排序算法