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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

二分查找最大比较次数证明

發布時間:2025/3/17 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二分查找最大比较次数证明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

結論

對n個元素進行二分查找,最大比較次數為:?log2n?+1\lfloor log_2n \rfloor +1?log2?n?+1

問題

給定升序數組,各元素不同,查找某元素。
如果該元素存在:輸出該元素的下標
如果不存在該元素,輸出-1
算法思路:

  • 對于有序數列(從小到大),設定左端l(最小元素下標)和右端r(最大元素下標)
  • 當滿足條件l <= r時,求中點m,將中點元素的值與所要查找的值比較
  • 若中點元素值比所要查找元素小,則應找后半段,所以l = m+1,否則應找前半段r = m - 1
  • 重復以上過程,直到找到為止,若l > r,則說明找不到。
    代碼:
//輸入n,輸入n個數(升序,各不相同),輸入x,求x是第幾個數 #include <bits/stdc++.h> using namespace std; int main() {int n, a[1005], x, l, r, m;cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i];cin >> x;l = 1, r = n;while(l <= r)//l在r左邊 {m = (l + r) / 2;//取中點位置 if(x > a[m])//如果x在右半部分 l = m + 1;//l移到中點右邊 else if(x < a[m])//如果x在左半部分 r = m - 1;//r移到中點左邊 else{cout << m;//如果中點是要查找的數字,那么輸出該位置 return 0;}}cout << -1;//沒找到,輸出-1 return 0; }

二分查找的最大比較次數

按上述算法進行二分查找,證明二分查找的最大查找次數
引理1:如果k為偶數,且k≥1k\ge1k1,那么?log2k?=?log2(k+1)?\lfloor log_2k\rfloor=\lfloor log_2(k+1)\rfloor?log2?k?=?log2?(k+1)?
證明:
設x = ?log2k?\lfloor log_2k\rfloor?log2?k?,則有x≤log2k<x+1x\le log_2k < x+1xlog2?k<x+1
只需證明x≤log2(k+1)<x+1x \le log_2(k+1) < x+1xlog2?(k+1)<x+1,即可證明?log2k?=?log2(k+1)?\lfloor log_2k\rfloor=\lfloor log_2(k+1)\rfloor?log2?k?=?log2?(k+1)?

log2k<x+1?k<2x+1log_2k < x+1 \Rightarrow k <2^{x+1}log2?k<x+1?k<2x+1
由于k和2x+12^{x+1}2x+1都是整數,所以有k+1≤2x+1k+1\le2^{x+1}k+12x+1
而k是偶數,k+1是奇數,2x+12^{x+1}2x+1一定是偶數,所以不可能滿足k+1=2x+1k+1=2^{x+1}k+1=2x+1
所以有k+1<2x+1?log2(k+1)<x+1k+1<2^{x+1} \Rightarrow log_2(k+1)<x+1k+1<2x+1?log2?(k+1)<x+1
易知:x≤log2k<log2(k+1)x \le log_2k <log_2(k+1)xlog2?k<log2?(k+1)
所以x≤log2(k+1)<x+1x \le log_2(k+1) < x+1xlog2?(k+1)<x+1,該引理得證。

證明對n個元素進行二分查找,最大比較次數為:?log2n?+1\lfloor log_2n \rfloor +1?log2?n?+1

證明:用數學歸納法
已知n為2時,找第1個元素需要比較1次,找第2個元素需要比較2次,最大查找2次,滿足?log2n?+1\lfloor log_2n \rfloor +1?log2?n?+1
假設2≤n≤k2\le n\le k2nk時,最大查找次數為?log2k?+1\lfloor log_2k \rfloor +1?log2?k?+1,證明:n為k+1時最大查找次數為?log2(k+1)?+1\lfloor log_2(k+1) \rfloor +1?log2?(k+1)?+1
n=k+1n=k+1n=k+1時,進行一次二分查找后,下一次要查找的長度為:

  • 如果k+1為偶數,下一次查找的長度為k+12\frac{k+1}{2}2k+1?,查找這一段的最大查找次數為?log2k+12?+1=?log2(k+1)?\lfloor log_2\frac{k+1}{2} \rfloor +1=\lfloor log_2(k+1) \rfloor?log2?2k+1??+1=?log2?(k+1)?,加上剛剛進行的一次查找,最大查找次數為:?log2(k+1)?+1\lfloor log_2(k+1) \rfloor +1?log2?(k+1)?+1
  • 如果k+1為奇數,下一次查找的長度為k/2,查找這一段的最大查找次數為:?log2k2?+1=?log2k?\lfloor log_2\frac{k}{2} \rfloor +1=\lfloor log_2k \rfloor?log2?2k??+1=?log2?k? ,當k+1為奇數即k為偶數時,根據引理1有:?log2k?=?log2(k+1)?\lfloor log_2k\rfloor=\lfloor log_2(k+1)\rfloor?log2?k?=?log2?(k+1)?,加上剛剛進行的一次查找,最大查找次數為:?log2(k+1)?+1\lfloor log_2(k+1) \rfloor +1?log2?(k+1)?+1

原命題得證。

總結

以上是生活随笔為你收集整理的二分查找最大比较次数证明的全部內容,希望文章能夠幫你解決所遇到的問題。

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