国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

二分(折半查找)詳細(xì)解答(邊界條件終止條件等等詳細(xì)解釋)

這篇具有很好參考價(jià)值的文章主要介紹了二分(折半查找)詳細(xì)解答(邊界條件終止條件等等詳細(xì)解釋)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

刷 Leetcode 總能遇到關(guān)于二分的題目,但是之前也只是草草地了解一下,每次在使用的時(shí)候都需要找模板,要不然就需要對(duì)于邊界條件進(jìn)行調(diào)試,著實(shí)是很麻煩?。?!


二分介紹:

首先來(lái)簡(jiǎn)單介紹一下二分:二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求?線性表?必須采用?順序存儲(chǔ)結(jié)構(gòu),而且表中元素按關(guān)鍵字有序排列。

優(yōu)點(diǎn):

  1. 比較次數(shù)少:二分查找每次將搜索范圍縮小一半,因此比較次數(shù)較少,查找速度快。
  2. 時(shí)間復(fù)雜度低:在有序數(shù)組中,二分查找的時(shí)間復(fù)雜度為O(log n),其中n為搜索范圍的大小。相比線性查找的O(n)時(shí)間復(fù)雜度,二分查找更高效。
  3. 可靠性高:由于二分查找是基于有序數(shù)組進(jìn)行的,因此在數(shù)組有序的前提下,可以保證查找結(jié)果的準(zhǔn)確性。

缺點(diǎn):

  1. 要求有序數(shù)組:二分查找要求待查表為有序表,如果數(shù)組無(wú)序,則需要先進(jìn)行排序操作,增加了額外的時(shí)間復(fù)雜度。
  2. 插入刪除困難:由于二分查找是基于有序數(shù)組進(jìn)行的,插入和刪除操作會(huì)破壞數(shù)組的有序性,因此在插入和刪除元素時(shí)需要維護(hù)數(shù)組的有序性,增加了操作的復(fù)雜度。
適用范圍以及題型:

  在一段有序序列中尋找指定元素(或者該序列中不存在指定元素,返回小于等于指定元素的最大值)等等


二分法講解:

arr數(shù)組為有序序列
left: 左邊界 right:右邊界 mid = (left + right) / 2: 中間下標(biāo) 循環(huán)條件: left .. right

上述為二分中的左邊界(left),右邊界(right),中間元素下標(biāo)(mid).

二分法分類:

1.閉區(qū)間(左邊界 left = 0, 右邊界 right = arr.size() - 1)(從序列中能夠找到對(duì)應(yīng)的元素)

先插入代碼:

        // 1 2 3 5 6 8 9 10(有序數(shù)組中的元素)
        int left = 0, right = arr.size() - 1;
        int goal = 5;
while(left <= right){ int mid = ( left + right) / 2; if(goal > arr[mid]){ left = mid + 1; }else{ right = mid - 1; } cout << "Left:" << left << " " << "Right:" << right << " " ; } cout << "結(jié)果是" << left << endl;

我們直接進(jìn)行分析(先不要想為什么這樣子,先跟著我的思路走):
(1)閉區(qū)間初始化:
  left = 0, right = arr.size() - 1,則此時(shí) left 和 right 代表的分別是數(shù)組序列的起始元素和末尾元素
(2)循環(huán)條件的設(shè)置:
  循環(huán)結(jié)束的標(biāo)志是區(qū)間內(nèi)沒(méi)有元素,因此只有當(dāng) left < right 的時(shí)候才會(huì)終止,因此設(shè)置 while(left <= right)
(3)循環(huán)中 if 語(yǔ)句滿足與不滿足后的 left 和 right 的設(shè)置
  暫時(shí)不討論為什么這樣子設(shè)置

來(lái)看終止情況:
終止前的一次: left == right
設(shè) X = left, Y = right (這里的X和Y是不會(huì)變的,因?yàn)榇藭r(shí) left == right,所以可以 X == Y)
此時(shí) mid == X (或者Y),結(jié)果只有兩種可能,goal對(duì)應(yīng)元素下標(biāo)為 (1)X對(duì)應(yīng)的? 或者 (2)X + 1對(duì)應(yīng)的
    前面這句話不理解可以看 while 循環(huán)中的 if 語(yǔ)句,流程圖如下:
二分(折半查找)詳細(xì)解答(邊界條件終止條件等等詳細(xì)解釋)

?

接著我們分析兩種情況:
情況一:X對(duì)應(yīng)的元素是目標(biāo)值
  則此時(shí)進(jìn)入 if 語(yǔ)句,判斷為 N,進(jìn)入第二個(gè)執(zhí)行語(yǔ)句: right = mid - 1, 則此時(shí) left 不變,結(jié)果就是 left, 就是 X

情況二:X + 1對(duì)應(yīng)的元素是目標(biāo)值
  則此時(shí)進(jìn)入 if 語(yǔ)句,判斷為 Y,進(jìn)入第一個(gè)執(zhí)行語(yǔ)句:left = mid + 1,則此時(shí)結(jié)果仍然是 left, 就是 X + 1

綜上:cout << left << endl; 就可以得到正確答案!

2.閉區(qū)間 從序列中尋找小于等于目標(biāo)值的最大元素

先插入代碼:

       // 1 2 3 5 6 8 9 10(有序數(shù)組中的元素) 
       bool flag = true;
       int left = 0, right = arr.size() - 1, goal = 11;
       while(left <= right){
           int mid = ( left + right) / 2;
           if(goal > arr[mid]){
               left = mid + 1;
           }else if(goal == arr[mid]){
               cout << "找到相等的元素: "<< mid << endl;
               flag = false;
               break;
           }else{
               right = mid - 1;
           }
        }     
        if(flag) cout << " 小于goal的最大元素下標(biāo)是" << right << endl; 

?

分析:首先若是區(qū)間中出現(xiàn)了與 goal 值相等的元素,則直接返回;
這個(gè)是沒(méi)有問(wèn)題的,我們考慮如下情況:其中不存在等于 goal 的元素,則進(jìn)行以下分析:

來(lái)看終止情況:
終止前的一次: left == right
設(shè) X = left, Y = right (這里的X和Y是不會(huì)變的,因?yàn)榇藭r(shí) left == right,所以可以 X == Y)
此時(shí) mid == X (或者Y,因?yàn)閄 == Y),結(jié)果只有兩種可能,goal對(duì)應(yīng)元素下標(biāo)為 :(1)X對(duì)應(yīng)的? 或者 (2)X - 1對(duì)應(yīng)的
接著我們分析兩種情況:(注意:以下情況考慮的時(shí)候沒(méi)有考慮 goal == arr[mid],因?yàn)槿羰浅霈F(xiàn)這種情況則直接結(jié)束循環(huán))

情況一:X對(duì)應(yīng)的元素是目標(biāo)值
  則此時(shí)進(jìn)入 if 語(yǔ)句,判斷為 Y,進(jìn)入第一個(gè)執(zhí)行語(yǔ)句: left = mid + 1, 則此時(shí) right 不變,結(jié)果就是 right, 就是 Y (X == Y)

情況二:X - 1對(duì)應(yīng)的元素是目標(biāo)值
  則此時(shí)進(jìn)入 if 語(yǔ)句,判斷為 N,進(jìn)入第一個(gè)執(zhí)行語(yǔ)句:right = mid - 1,則此時(shí)結(jié)果是 right, 就是 Y - 1 (Y - 1 == X - 1)

綜上:cout << right << endl; 就可以得到正確答案!

?


  

?

?



文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-746038.html

到了這里,關(guān)于二分(折半查找)詳細(xì)解答(邊界條件終止條件等等詳細(xì)解釋)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【二分查找】詳細(xì)圖解

    【二分查找】詳細(xì)圖解

    目錄 一.什么是二分查找法? 二.算法要求 三.算法思想 圖解(要找的數(shù)k的值為3) ?參考代碼 二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用順序儲(chǔ)存結(jié)構(gòu),而且表中元素按有序排列。? 1.必須是 有序排列。

    2024年02月10日
    瀏覽(16)
  • C++兩個(gè)矩陣相乘代碼(內(nèi)附有矩陣相乘的條件與規(guī)則,以及對(duì)代碼的詳細(xì)解答)

    ? ? ?再?gòu)?fù)制粘貼代碼之前可以先了解學(xué)習(xí)一下什么是矩陣相乘,矩陣相乘的條件與規(guī)則又是什么。 點(diǎn)擊一下鏈接即可進(jìn)入學(xué)習(xí): ? ?? ? ? ? ? ? ? ? ? ?#矩陣相乘的學(xué)習(xí)鏈接 ? ? ? ? ?以下是兩個(gè)矩陣相乘的代碼塊(輸入版) 補(bǔ)充①:對(duì)于for循環(huán)了解還不夠透徹的可以進(jìn)

    2024年02月11日
    瀏覽(20)
  • C語(yǔ)言--順序查找、折半查找

    C語(yǔ)言--順序查找、折半查找

    順序查找(sequential search)就是按照 數(shù)組 的順序一 一比較數(shù)組中的元素的值和所查找的值。如下圖表所示,遍歷數(shù)組進(jìn)行比較。若找到,則break跳出循環(huán)。 a[0] a[1] a[2] a[3] a[4] 9 12 22 13 34 22==9? 22==12? 22==22? ? ? ?????????折半搜索(英語(yǔ):half-interval search),也稱二分搜索、

    2024年02月07日
    瀏覽(22)
  • 查找:線性表的C語(yǔ)言代碼實(shí)現(xiàn)(順序查找、折半查找)

    查找:線性表的C語(yǔ)言代碼實(shí)現(xiàn)(順序查找、折半查找)

    一、線性表結(jié)構(gòu) 兩個(gè)類的定義 二、線性表的初始化以及根據(jù)輸入的元素建立線性表 1.線性表的初始化,初始化一個(gè)空的線性表 2.根據(jù)用戶需求,向線性表中添加元素? 三、順序查找? Search1函數(shù)(沒(méi)有設(shè)置哨兵,需要比較兩次) 四、順序查找(設(shè)置哨兵,不用再比較是否會(huì)越

    2024年02月09日
    瀏覽(27)
  • 折半查找的判定樹(shù)

    折半查找的判定樹(shù)

    二叉判定樹(shù)是用于描述解決問(wèn)題的思路,比如可以使用判定樹(shù)描述N個(gè)數(shù)的比較過(guò)程,是一種對(duì)過(guò)程的描述。 它也可以用于描述二分查找(即折半查找,以下都作二分查找)的過(guò)程。 描述二分查找的二叉判定樹(shù),我們也可以叫折半查找判定樹(shù), 從這樣的判定樹(shù),我們可以分析

    2024年02月08日
    瀏覽(18)
  • C語(yǔ)言——折半查找法

    C語(yǔ)言——折半查找法

    假如現(xiàn)在有一組數(shù)據(jù),你想要查詢這個(gè)具體某一個(gè)數(shù)據(jù)在這一堆數(shù)據(jù)中的所在位置,這個(gè)時(shí)候就需要程序在這一組數(shù)據(jù)中,找到與想要查找的目標(biāo)數(shù)據(jù)相匹配的那個(gè)數(shù)據(jù),然后返回相對(duì)應(yīng)的位置。如果將問(wèn)題再細(xì)化簡(jiǎn)化一點(diǎn),假如現(xiàn)在有一組有順序的數(shù)字,需要你編寫(xiě)程序找

    2024年02月01日
    瀏覽(24)
  • 折半查找算法(BinarySearch)

    折半查找算法(BinarySearch)

    ????????查找算法是一種在數(shù)字列表中確定目標(biāo)元素所在位置的算法。假設(shè)給定一個(gè)目標(biāo)元素 11 和一個(gè)包含元素 11 的數(shù)字列表(例如 10, 11, 12,13,14, 15, 16, 17, 18, 19, 20),然后在該數(shù)字列表中找到目標(biāo)元素的位置。 ? ? ? ? 折半查找算法也叫做對(duì)分查找和二分查找。折半

    2024年02月03日
    瀏覽(23)
  • 折半查找、

    描述 給定一個(gè)已按從大到小排序好的數(shù)組和一個(gè)數(shù),使用折半查找算法,輸出該數(shù)在數(shù)組中的位置。如果該數(shù)不在數(shù)組中,則輸出“無(wú)此數(shù)”。 輸入 輸入為兩行,第一行包含多個(gè)整數(shù),用空格分隔,表示已排序好的數(shù)組;第二行為需要查找的數(shù)。 輸出 輸出一個(gè)整數(shù),表示

    2024年02月14日
    瀏覽(20)
  • 折半查找實(shí)驗(yàn) (數(shù)據(jù)結(jié)構(gòu))

    折半查找實(shí)驗(yàn) (數(shù)據(jù)結(jié)構(gòu))

    一、實(shí)驗(yàn)?zāi)康?掌握折半查找算法的基本思想 掌握折半查找算法的實(shí)現(xiàn)方法 掌握折半查找的時(shí)間性能 掌握折半查找類的定義和使用 二、實(shí)驗(yàn)要求 熟悉C++語(yǔ)言編程 了解折半查找的原理 了解折半查找類的定義、應(yīng)用 三、實(shí)驗(yàn)內(nèi)容 1、問(wèn)題描述 在一個(gè)有序序列中,折半查找一個(gè)

    2024年02月08日
    瀏覽(23)
  • 17-數(shù)據(jù)結(jié)構(gòu)-查找-(順序、折半、分塊)

    17-數(shù)據(jù)結(jié)構(gòu)-查找-(順序、折半、分塊)

    ????????簡(jiǎn)介:查找,顧名思義,是我們處理數(shù)據(jù)時(shí)常用的操作之一。大概就是我們從表格中去搜索我們想要的東西,這個(gè)表格,就是所謂的查找表(存儲(chǔ)數(shù)據(jù)的表)。而我們?cè)趺丛O(shè)計(jì)查找,才可以讓計(jì)算機(jī)更快的去找到篩選我們所需要的信息呢,因此,關(guān)于怎么設(shè)計(jì)查找

    2024年02月09日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包