日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

递归与分治——二分查找算法(折半查找算法)

發布時間:2024/4/17 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归与分治——二分查找算法(折半查找算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二分搜索主要解決的問題是確定排序后的數組中是否包含目標元素val。
二分搜索通過持續跟蹤數組中包含元素val的范圍。分為兩個過程,第一就是找到了,第二個就是沒找到;
一開始,這個范圍是整個數組,然后通過將val與數組中的中間項進行比較并拋棄一半的范圍來縮小范圍。該過程持續進行。
1、非遞歸算法

//12 12 12 13 13 13 45 45 56 56 56 78 89 90 100,查詢val,且返回最左邊(最右邊)的val的下標 int BinSearch(const vector<int>& ar, int val) {int left = 0, right = ar.size() - 1;int pos = -1;while (left <= right){int mid = (right - left) / 2 + left;if (val < ar[mid]){right = mid - 1;}else if (val > ar[mid]){left = mid + 1;}else{//while (mid > left && ar[mid - 1] == val) --mid; //當有多個val值時,找最左邊下標時 //while (mid < right && ar[mid + 1] == val) ++mid; //當有多個val值時,找最右邊下標時pos = mid;break;}}return pos; }

編寫代碼需要注意:

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、二分查找依賴于順序存儲結構,要求內存空間連續,如果數據量太過大的情況下,可能存在空間不夠分配的困難。

總結

以上是生活随笔為你收集整理的递归与分治——二分查找算法(折半查找算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。