話說面試--二分查找

今天去參加面試的時候被提問到一個問題--請你解釋一下二分查找。一時間忽然想不起來。于是乎回來復習了一下。

圖片來源網絡

在百度百科里面是這樣描述的:“二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用于不經常變動而查找頻繁的有序列表。......”看到這里,我們應該大致明白了二分查找算法是怎么一回事了。但是如何表達才能在面試過程中讓面試官刮目相看呢?

我們來分析一下,想讓面試官刮目相看的話,可能會是什么原因?本人大致做這樣的假設

1、回答得非常正確、專業

2、回答得非常生動、形象,通俗易懂

3、回答得非常全面

如果想讓面試官在技術方面對你認可,必須表現得十分的專業,專業表現在表述知識的時候專業術語非常到位、其二表現在專業知識廣泛,知道該知識點是什么、什么時候用,為什么這么用。如果能恰到好處的表現出這兩點,那么面試官對你的看法應該就會大大提高,也有助于后面談薪資的事情。

回到剛剛的問題上,假如剛才我們分析的幾個方面就是令面試官刮目相看的點,那么我們應該怎么做呢?以本人為例子吧。假如要我背剛剛的那段話,說實話短期內背誦記住是完全沒問題的,但是過幾天又忘了。死記硬背是一件非常痛苦的事情。那么我們用聯想記憶法試一下:該算法有兩個名字(二分查找、折半查找)、優點三個(比較次數少、查找速度快、平均性能好)、缺點兩個(待查找表為有序表、插入刪除困難)。用數字表示就是232,圖形表示就是=≠=(形容為 此二分非彼二分 )

那么我們在面試的時候就可以這樣表述:(面試的時候最好自帶紙筆,原因不解釋)用筆寫出剛剛的=≠=的公式(原因是聯想記憶更容易回憶起以前的內容),指著左邊的等號跟面試官說“此二分非彼二分,二分查找不是簡單的分兩份,然后執行查找;它有兩個名字,一個叫二分查找、另一個叫折半查找;就是在一個有序數組中,取數組中的中間值和要找的值進行比較,當要查找的值大于中間值,則在右邊的區間繼續取一個中間值和要比較的數進行比較。當找查找的值小于中間值時則反之,直至最后要查找的值和中間值相同,則說明找到該值。該算法有三個優點(指向中間的不等號),一是比較次數少、二是查找速度快、三是平均性能好。因為次數少了,速度自然快了,平均性能當然也就好了。但是呢,它也有兩個缺點(指向右邊的等號),其一是必須有序,沒序的話,分成兩份比較中間值的話沒有意義,而排序本身是一件很耗時的運算;其二是增刪困難,因為增刪都要移動大量的結點。因此二分查找適用于那種一經建立就很少改動、而又經常需要查找的線性表(順序存儲結構)”到這里,如果能表達到這個程度已經是非常不錯的了,但是如果能舉個實際例子就更好了,因為面試官問你的初衷就是想知道你懂不懂,會不會用。而且本人寫這篇的初衷也是想讓閱讀的人跟本人一樣,從理解到能實際運用,這樣對你、對我、對面試官都是一件好事不是嗎?

(因為本人目前是做iOS的,因此舉例用OC語法)在OC的NSArray中有三種以上的二分查找方法,分別是:CFArrayBSearchValues、indexOfObject:inSortedRange:options:usingComparator和自定義的二分查找。(本人在網上找到了以下幾個例子供參考):

CFArray的二分查找方法

NSMutableArray *sortedArray = [NSMutableArray arrayWithObjects: @"Alice", @"Beth", @"Carol",@"Ellen",nil];

//Where is "Beth"?

unsigned index = (unsigned)CFArrayBSearchValues((CFArrayRef)sortedArray,

CFRangeMake(0, CFArrayGetCount((CFArrayRef)sortedArray)),

(CFStringRef)@"Beth",

(CFComparatorFunction)CFStringCompare,

NULL);

if (index < [sortedArray count] && [@"Beth" isEqualToString:sortedArray[index]])

{

NSLog(@"Beth was found at index %u", index);

} else {

NSLog(@"Beth was not found (index is beyond the bounds of sortedArray)");

}

//Where should we insert "Debra"?

unsigned insertIndex = (unsigned)CFArrayBSearchValues((CFArrayRef)sortedArray,

CFRangeMake(0, CFArrayGetCount((CFArrayRef)sortedArray)),

(CFStringRef)@"Debra",

(CFComparatorFunction)CFStringCompare,

NULL);

[sortedArray insertObject:@"Debra" atIndex:insertIndex];

NSLog(@"%@",sortedArray);

NSArray的二分查找方法

NSArray *sortedArray = ... // must be sorted

id searchObject = ...

NSRange searchRange = NSMakeRange(0, [sortedArray count]);

NSUInteger findIndex = [sortedArray indexOfObject:searchObject

inSortedRange:searchRange

options:NSBinarySearchingFirstEqual

usingComparator:^(id obj1, id obj2)

{

return [obj1 compare:obj2];

}];

自己編寫二分查找算法

int main(int argc, const char * argv[])

{

@autoreleasepool {

// Conceptual tutorial

NSArray *numberArray = @[@1, @3, @27, @36, @42, @70, @82];

NSNumber *searchNum = @70;

NSUInteger mid;

NSUInteger min = 0;

NSUInteger max = [numberArray count] - 1;

BOOL found = NO;

while (min <= max) {

mid = (min + max)/2;

if ([searchNum intValue] == [numberArray[mid] intValue]) {

NSLog(@"We found the number! It is at index %lu", mid);

found = YES;

break;

} else if ([searchNum intValue] < [numberArray[mid] intValue]) {

max = mid - 1;

} else if ([searchNum intValue] > [numberArray[mid] intValue]) {

min = mid + 1;

}

}

if (!found) {NSLog(@"The number was not found.");

}

}

return 0;

}

以上就是三個實例。那么在什么時候我們會用到呢?二分查找,查找,查找,當然是找東西的時候會用啦!當我們編寫搜索算法時候會用到,因此記住,在項目遇到搜索、查找的時候,記得回憶起二分查找這個算法(當然也可以嘗試用其他算法,比如冒泡、快排等等,具體的根據需求去分析即可)。

二分查找還有一些其他的注意事項,比如在Java中 二分查找的原始代碼有幾點需要注意的

intbinarySearch(intA[],intleft,intright,inttarget)

{intmid;

while(left<=right)

{mid=(left+right)/2;

if(A[mid])

returnmid;

elseright=mid-1;

}

return -1;

}


一是mid溢出、二是常數步的前進,具體就不展開敘述了,一般面試的時候都會考察邊界條件迭代、循環終止條件設定以及中位數計算,如有興趣可參考以下博客:二分查找的一些注意事項在寫二分查找的時候我在想些什么

以上就是本博客的全部內容,如有紕漏或建議請指教,十分感謝!

注:

OC三個實例例子來自于:一個關注移動互聯網,iOS開發的個人博客。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容