亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問在面試中還遇到過哪些二分查找的變種?

請問在面試中還遇到過哪些二分查找的變種?

Qyouu 2023-04-25 19:15:51
二分查找問題是比較經典而且面試中??嫉膯栴},實現起來還是容易出問題,能夠過關的不多,請問實現一個二分查找有哪些容易錯的地方(比如小數的處理、數據相加的范圍等)?變種一:(多個公司的面試都喜歡出)如果有序序列發生偏移即把序列的后面一部分截取放在前面,比如:11 13 1 2 4 7 9此時再給定一個數,查找其在序列中是否存在(返回其位置),請問如何實現?變種二:同上題描述,找出序列中最小元素位置。變種三:給定任意一個序列,找出其中的一個谷/峰,谷的定義為兩邊的數均大于某個數。
查看完整描述

3 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

  1. 對于輸入的所有單詞,使用排序算法使得所有單詞按照字典序排列,然后用BS算法找到給定的單詞的下標。

  2. 在給定的字符串序列中(按照字典序排列好的)存在一些空串,請你找出給定字符串的位置,不在里面返回 -1.

  3. 在一個排序好的數組中,有一些元素是重復的。 我們寫一個函數,對給定的數,我們返回這個數出現的次數。

  4. 在行列排序的矩陣中里面需找某個元素,例如如下輸入:

1 5 7 10
2 6 8 15
4 9 11 16
12 13 19 21

輸入滿足按行來看,是遞增排序,按列也是遞增排序,現在要是否存在某個元素。


查看完整回答
反對 回復 2023-04-29
?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

說下第三個
要用三分法
記 l , m , r 分別為左端點、中端點、右端點。f(x) 為在x點的函數的值
取 lm = (l + m ) / 2 , rm = (m + r) / 2 ;

然后 比較 f(lm) f(rm)的關系 , 相應的更新l , m , r 就可以了


查看完整回答
反對 回復 2023-04-29
?
呼如林

TA貢獻1798條經驗 獲得超3個贊

個人總結的幾個變種(只是為了描述算法本身,為了簡單不考慮越界等等異常情況),歡迎補充。

/*  
    二分查找的前提是數組有序
    二分查找的時間復雜度:O(lgn)
    以下列出二分查找的三種動機:
    1、查找滿足條件的關鍵字的位置
    2、查找滿足條件的最小位置
    3、查找滿足條件的最大位置
    找不到返回-1,找到了則返回位置
*///動機1(原始模型):查找滿足條件的關鍵字的位置int BinarySearch(int *a,int l,int r){    int m;    while(l<=r)
    {
        m=(l+r)/2;        if(a[m]==key)
            return m;        if(a[m]>key)
            r=m-1;        else
            l=m+1;
    }
    return-1;
}//動機2:找滿足條件的最小位置int BinarySearch(int *a,int l,int r){    int m,ans=-1;    while(l<=r)
    {
        m=(l+r)/2;        //滿足條件
        if(ok())
            ans=m,r=m-1;        else
            l=m+1;
    }
    return ans;
}//動機3:找滿足條件的最大位置int BinarySearch(int *a,int l,int r){    int m,ans=-1;    while(l<=r)
    {
        m=(l+r)/2;        //滿足條件
        if(ok())
            ans=m,l=m+1;        else
            r=m-1;
    }
    return ans;
}//動機2、3十分相似,舉一種常用情況:找小于等于某數的最大位置int BinarySearch(int *a,int l,int r,int key){    int m,ans=-1;    while(l<=r)
    {
        m=(l+r)/2;        if(key>=a[m])
            ans=m,l=m+1;        else
            r=m-1;
    }
    return ans;
}//變型1:找滿足條件的最小數(double)double BinarySearch(double l,double r){
    double m,ans;    //保留n位小數就讓精度為n+1位,比如要求保留3位小數就讓精度為4位
    while(r-l>=0.0001)
    {
        m=(l+r)*0.5;        if(ok())
            ans=m,r=m;        else
            l=m;
    }
    return ans;
}
查看完整回答
反對 回復 2023-04-29
  • 3 回答
  • 0 關注
  • 216 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號