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

【算法小課堂】二分查找算法

這篇具有很好參考價(jià)值的文章主要介紹了【算法小課堂】二分查找算法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【算法小課堂】二分查找算法,算法小課堂,算法挨揍日記,算法

簡單思路:

當(dāng)我們要從一個(gè)序列中查找一個(gè)元素的時(shí)候,最快想到的方法就是順序查找法(即:從前到后依次查找)。但這種方法過于無腦,就是暴力的把每個(gè)元素都排查一遍。元素個(gè)數(shù)少的時(shí)候還行,一旦元素個(gè)數(shù)多起來,效率是非常低下,所以在實(shí)際中這種查找的方法是被摒棄的。

當(dāng)題目或者實(shí)際對(duì)時(shí)間復(fù)雜度有著很高的要求的時(shí)候,這種暴力解法就顯得很乏力

這里就不得不介紹一種簡單且效率較高的查找方法了:二分查找法,又稱折半查找法。但該方法是建立在有序的前提下的,基本思路就是:

利用兩個(gè)指針left和right,不斷取中點(diǎn)來不斷把區(qū)間減小從而找到我們的答案

二分查找法的優(yōu)勢:

  • 二分查找法的時(shí)間復(fù)雜度:O(logN)

  • 暴力解法的時(shí)間復(fù)雜度:O(N)

如何直觀來體現(xiàn)二分查找法時(shí)間復(fù)雜度的優(yōu)勢呢?

【算法小課堂】二分查找算法,算法小課堂,算法挨揍日記,算法

可以看出 二分查找 在查找數(shù)字 37 時(shí)只需3次,而 順序查找 在查找37時(shí)需要12次。

二分查找的條件:

很多算法書都是寫的具有有序性,其實(shí)更準(zhǔn)確的是具有二段性

  • 也就是具有可以把數(shù)組分為兩端的性質(zhì)

二分查找有兩個(gè)限制條件:

  1. 查找的數(shù)量只能是一個(gè),不能是多個(gè)
  2. 查找的對(duì)象在邏輯上必須是有序的(這個(gè)不是必要條件,更深層次是就有二段性)

樸素二分查找:

1.left=0,right=數(shù)組最后一個(gè)位置的下標(biāo)

2.取中點(diǎn):mid=(right-left)/2

二分法的思想很簡單,因?yàn)檎麄€(gè)數(shù)組是有序的,數(shù)組默認(rèn)是遞增的。

首先選擇數(shù)組中間的數(shù)字和需要查找的目標(biāo)值比較

  • 如果相等最好,就可以直接返回答案了

  • 如果不相等

    如果中間的數(shù)字大于目標(biāo)值,則中間數(shù)字向右的所有數(shù)字都大于目標(biāo)值,全部排除

    如果中間的數(shù)字小于目標(biāo)值,則中間數(shù)字向左的所有數(shù)字都小于目標(biāo)值,全部排除

704. 二分查找

以此題為例:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left=0;
        int right=nums.size()-1;
        while(left<=right)
        {
            int mid=left+(right-left)/2;
            if(nums[mid]==target) return mid;
            if(nums[mid]>target) right=mid-1;
            if(nums[mid]<target) left=mid+1;
        }
        return -1;
        }
};

樸素二分查找的模版:

        while(left<=right)
        {
            int mid=left+(right-left)/2;
            if(nums[mid]==target) return mid;
            if(nums[mid]>target) ...;
            if(nums[mid]<target) ...;
        }
        return ...;

二分查找左右端點(diǎn):

我們通過一個(gè)例子:

34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置

本題我們利用二分來解決左右端點(diǎn)的問題,首先left和right肯定有的

我們通過一個(gè)示例來了解本題:[1,2,3,3,3,4,5]

查找左端點(diǎn):我們這里用t來代替target(這樣比較好敘述)

【算法小課堂】二分查找算法,算法小課堂,算法挨揍日記,算法

  • 二分的思路操作:我們可以將上述示例分為兩個(gè)部分,因?yàn)槲覀儸F(xiàn)在查找左端點(diǎn),因此我可以將示例分為【[1,2],[3,3,3,4,5]】

【算法小課堂】二分查找算法,算法小課堂,算法挨揍日記,算法

  1. 當(dāng)x<t時(shí),處于【1,2】這個(gè)區(qū)間,left=mid+1
  2. 當(dāng)x>=t時(shí),處于【3,3,3,4,5】這個(gè)區(qū)間,right=mid(這里不能等于mid-1,因?yàn)槿绻鹠id=0,right=-1會(huì)越界)
  • 細(xì)節(jié)處理:

循環(huán)條件:

  1. left<right
  2. left<=right ×

我們選擇那種呢?我們來討論一下:

【算法小課堂】二分查找算法,算法小課堂,算法挨揍日記,算法

  1. 有結(jié)果
  2. 全大于t(t1),right一直向左走,最后right為left結(jié)束,如果是left<=right會(huì)死循環(huán)
  3. 全小于t(t2),left一直向右走,最后left在right右邊結(jié)束

以此我們只能選擇第一種不能選擇第二種!

求中間的操作:

  1. left+(right-left)/2 ×
  2. left+(right-left+1)/2

我們考慮一下極端情況就可以知道了!當(dāng)只剩下兩個(gè)元素的時(shí)候:

【算法小課堂】二分查找算法,算法小課堂,算法挨揍日記,算法
第一種沒有問題,第二種mid=0+2/2=1,當(dāng)進(jìn)行l(wèi)eft+1操作的時(shí)候會(huì)發(fā)生越界

查找右端點(diǎn)

  • 二分的思路操作:我們可以將上述示例分為兩個(gè)部分,因?yàn)槲覀儸F(xiàn)在查找左端點(diǎn),因此我可以將示例分為【[1,2,3,3,3].[4,5]】

【算法小課堂】二分查找算法,算法小課堂,算法挨揍日記,算法

  1. 當(dāng)x<=t時(shí),處于【1,2,3,3,3】這個(gè)區(qū)間,left=mid
  2. 當(dāng)x>t時(shí),處于【4,5】這個(gè)區(qū)間,right=mid-1
  • 細(xì)節(jié)處理:

循環(huán)條件:

  1. left<right
  2. left<=right ×

還是選擇left<right

求中間的操作:

  1. left+(right-left)/2
  2. left+(right-left+1)/2 ×

我們考慮一下極端情況就可以知道了!當(dāng)只剩下兩個(gè)元素的時(shí)候:

【算法小課堂】二分查找算法,算法小課堂,算法挨揍日記,算法

第一種當(dāng)mid=0+1/2=0時(shí),right=mid-1越界,第二種沒有問題

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        //特殊情況處理一下
        if(nums.size()==0)return {-1,-1};
        int left=0,right=nums.size()-1;
        vector<int> ret;
        //查找左端點(diǎn)
        while(left<right)
        {
            int mid=left+(right-left)/2;
            if(nums[mid]<target)left=mid+1;
            if(nums[mid]>=target)right=mid;
        }
        //當(dāng)left==right時(shí)就是結(jié)果
        if(nums[left]!=target)return {-1,-1};
        else ret.push_back(left);
        //查找右端點(diǎn)
        left=0,right=nums.size()-1;
        while(left<right)
        {
            int mid=left+(right-left+1)/2;
            if(nums[mid]<=target)left=mid;
            if(nums[mid]>target)right=mid-1;
        }
        if(nums[right]!=target)return {-1,-1};
        else ret.push_back(right);
        return ret;
    }
};

查找區(qū)間左右端點(diǎn)的模版:

【算法小課堂】二分查找算法,算法小課堂,算法挨揍日記,算法

模版,這里主要是取中間這里不太一樣,左端點(diǎn)時(shí)不用+1,右端點(diǎn)+1(記憶當(dāng)下面出現(xiàn)-1,上面就+1)

至于left和right可以現(xiàn)場推導(dǎo)

【算法小課堂】二分查找算法,算法小課堂,算法挨揍日記,算法文章來源地址http://www.zghlxwxcb.cn/news/detail-714384.html

到了這里,關(guān)于【算法小課堂】二分查找算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(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)文章

  • 【算法挨揍日記】day03——雙指針?biāo)惴╛有效三角形的個(gè)數(shù)、和為s的兩個(gè)數(shù)字

    【算法挨揍日記】day03——雙指針?biāo)惴╛有效三角形的個(gè)數(shù)、和為s的兩個(gè)數(shù)字

    ?? 611.?有效三角形的個(gè)數(shù) https://leetcode.cn/problems/valid-triangle-number/ 給定一個(gè)包含非負(fù)整數(shù)的數(shù)組? nums ?,返回其中可以組成三角形三條邊的三元組個(gè)數(shù)。 本題是一個(gè)關(guān)于三角形是否能成立的題目,首先我們假設(shè)三角形的三邊(a,b,c),我們要保證兩邊之和大于第三邊 ? ?題

    2024年02月12日
    瀏覽(22)
  • 【算法挨揍日記】day07——904. 水果成籃、438. 找到字符串中所有字母異位詞

    【算法挨揍日記】day07——904. 水果成籃、438. 找到字符串中所有字母異位詞

    904.?水果成籃 你正在探訪一家農(nóng)場,農(nóng)場從左到右種植了一排果樹。這些樹用一個(gè)整數(shù)數(shù)組? fruits ?表示,其中? fruits[i] ?是第? i ?棵樹上的水果? 種類 ?。 你想要盡可能多地收集水果。然而,農(nóng)場的主人設(shè)定了一些嚴(yán)格的規(guī)矩,你必須按照要求采摘水果: 你只有? 兩個(gè)

    2024年02月07日
    瀏覽(21)
  • Peter算法小課堂—貪心與二分

    Peter算法小課堂—貪心與二分

    題目描述: 有n輛車大甩賣,第i輛車售價(jià)a[i]元。有m個(gè)人帶著現(xiàn)金來申請(qǐng)購買,第i個(gè)到現(xiàn)場的人帶的現(xiàn)金為b[i]元,只能買價(jià)格不超過其現(xiàn)金額的車子。你是大賣場總經(jīng)理,希望將車和買家盡量多地進(jìn)行一對(duì)一配對(duì),請(qǐng)問最多賣出多少輛車? 貪心法模板: 比如說:每次挑最便

    2024年02月02日
    瀏覽(19)
  • 【算法系列篇】二分查找——這還是你所知道的二分查找算法嗎?

    【算法系列篇】二分查找——這還是你所知道的二分查找算法嗎?

    在生活中,我們往往會(huì)遇到在數(shù)組中查找某個(gè)確定的元素的時(shí)候,通常我們會(huì)選擇使用暴力解法,這樣雖然簡單,但是時(shí)間復(fù)雜度是O(N),時(shí)間效率比較低。那么是否有方法可以使得在具有二段性的數(shù)組中找某一特定的元素的時(shí)間復(fù)雜度低于0(N)呢?答案是肯定的,當(dāng)我們可以

    2024年02月11日
    瀏覽(21)
  • 【算法系列 | 8】深入解析查找算法之—二分查找

    【算法系列 | 8】深入解析查找算法之—二分查找

    心若有陽光,你便會(huì)看見這個(gè)世界有那么多美好值得期待和向往。 決定開一個(gè)算法專欄,希望能幫助大家很好的了解算法。主要深入解析每個(gè)算法,從概念到示例。 我們一起努力,成為更好的自己! 今天第8講,講一下查找算法的二分查找 查找算法是很常見的一類問題,主

    2024年02月07日
    瀏覽(32)
  • 【算法】二分查找(整數(shù)二分和浮點(diǎn)數(shù)二分)

    【算法】二分查找(整數(shù)二分和浮點(diǎn)數(shù)二分)

    大家好!今天我們來學(xué)習(xí)二分查找算法,這是一種效率很高的算法哦! 目錄 1. 整數(shù)二分 2. 整數(shù)二分模板 3. 整數(shù)二分模板題 3.1 洛谷 P2249 【深基13.例1】查找 3.2?Acwing789. 數(shù)的范圍 4. 浮點(diǎn)數(shù)二分 5. 浮點(diǎn)數(shù)二分模板 6. 浮點(diǎn)數(shù)二分模板題 6.1 Acwing 790.數(shù)的三次方根 6.2 洛谷 P1024 [

    2024年02月10日
    瀏覽(22)
  • C++二分算法(二分查找&二分答案)細(xì)節(jié)詳解

    ?二分算法可以分為 二分查找 和 二分答案 。 以在一個(gè) 升序數(shù)組 中查找一個(gè)數(shù)為例。它每次考察數(shù)組當(dāng)前部分的 中間元素 ,如果中間元素剛好是要找的,就結(jié)束搜索過程;如果中間元素小于所查找的值,那么左側(cè)的只會(huì)更小,不會(huì)有所查找的元素,只需到右側(cè)查找;如果

    2024年02月08日
    瀏覽(18)
  • 【Python查找算法】二分查找、線性查找、哈希查找

    【Python查找算法】二分查找、線性查找、哈希查找

    目錄 1 二分查找算法 ?2 線性查找算法 3 哈希查找算法 ????????二分查找(Binary Search)是一種用于在有序數(shù)據(jù)集合中查找特定元素的高效算法。它的工作原理基于將數(shù)據(jù)集合分成兩半,然后逐步縮小搜索范圍,直到找到目標(biāo)元素或確定目標(biāo)元素不存在。 以下是二分查找的

    2024年02月08日
    瀏覽(25)
  • 【算法】簡單的二分查找算法

    【算法】簡單的二分查找算法

    一個(gè)簡單的二分查找算法: ????????簡單描述:算法由靜態(tài)方法rank()實(shí)現(xiàn),它接受一個(gè)整數(shù)鍵和一個(gè)有序的int數(shù)組作為參數(shù),如果整數(shù)存在于數(shù)組,返回它的索引,否則返回-1,算法使用兩個(gè)變量lo和hi,并保證整數(shù)如果存在于數(shù)組中則它一定存在于a[lo...hi]中,然后通過循

    2024年01月21日
    瀏覽(28)
  • Java數(shù)據(jù)結(jié)構(gòu)與算法:查找算法之二分查找

    大家好,我是免費(fèi)搭建查券返利機(jī)器人賺傭金就用微賺淘客系統(tǒng)3.0的小編,歡迎回到本專欄。在這個(gè)冰冷的季節(jié)里,我們將一同探討Java中一種高效的查找算法——二分查找。讓我們點(diǎn)燃知識(shí)的火花,一同解鎖這個(gè)查找奇跡的秘密! 二分查找簡介 二分查找,也稱為折半查找,

    2024年01月21日
    瀏覽(40)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包