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

【手撕數(shù)據(jù)結(jié)構(gòu)】二分查找(好多細(xì)節(jié))

這篇具有很好參考價(jià)值的文章主要介紹了【手撕數(shù)據(jù)結(jié)構(gòu)】二分查找(好多細(xì)節(jié))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??鍵盤敲爛,年薪30萬??

目錄

普通版本的二分查找:

right只負(fù)責(zé)控制邊界(少了兩次比較):

時(shí)間復(fù)雜度更穩(wěn)定的版本:

BSLeftmost:

BSRightmost:


?文章來源地址http://www.zghlxwxcb.cn/news/detail-752849.html

普通版本的二分查找:

  • ??細(xì)節(jié)1:循環(huán)判定條件是left <= right
  • ?細(xì)節(jié)2:mid = (left + right ) >>> 1 原因見代碼注釋

/***
 * 二分查找的實(shí)現(xiàn) 3個版本
 * 時(shí)間復(fù)雜度:O(longn)
 * 空間復(fù)雜度:O(1)
 *
 * 細(xì)節(jié)1:循環(huán)判定條件是left <= right
 * 細(xì)節(jié)2:mid計(jì)算要用 >>> 因?yàn)閘eft + right 可能越界
 *      例如:right = Integer.MAX_INT-1 left = 0;
 *      第一輪計(jì)算沒問題 假設(shè)mid < target
 *      left = mid + 1; 這是后left+ right 就超出int的最大范圍,變成負(fù)數(shù)
 *      原因很簡單:java沒有無符號數(shù),最高位表示符號位,/ 運(yùn)算是先將補(bǔ)碼轉(zhuǎn)原碼 >>>位運(yùn)算是直接再二進(jìn)制上運(yùn)算
 */
public class Demo1 {
    public static void main(String[] args) {
        int[] nums = {1,4,6,8,15,76,145};
        int target = 145;
        int index1 = method1(nums, target);
        System.out.println(target + "索引為" + index1);
        System.out.println(target + "索引為" + index2);
    }

    private static int method1(int[] nums, int target) {
        int left = 0, right = nums.length-1;
        while(left <= right){
            //細(xì)節(jié) 用無符號右移運(yùn)算符
            int mid = (left + right) >>> 1;
            if(nums[mid] > target){
                right = mid - 1;
            }else if (nums[mid] < target){
                left = mid + 1;
            }else{
                return mid;
            }
        }
        return -1;
    }
}

right只負(fù)責(zé)控制邊界(少了兩次比較):

  • 改動1:while條件是left < right
  • 改動2:right = nums.length
public class Demo1 {
    public static void main(String[] args) {
        int[] nums = {1,4,6,8,15,76,145};
        int target = 145;
        int index2 = method2(nums, target);
        System.out.println(target + "索引為" + index2);
    }
}
    private static int method2(int[] nums, int target) {
        int left = 0, right = nums.length; //right 只代表有邊界,不參與比較
        while(left < right){
            int mid = (left + right) >>> 1;
            if(nums[mid] < target){
                left = mid + 1;
            }else if(nums[mid] > target){
                right = mid;
            }else {
                return mid;
            }
        }
        return -1;
    }

時(shí)間復(fù)雜度更穩(wěn)定的版本:

  • 細(xì)節(jié):減少了if比較次數(shù)
public class Demo1 {
    public static void main(String[] args) {
        int[] nums = {1,4,6,8,15,76,145};
        int target = 145;
        int index3 = method3(nums, target);
        System.out.println(target + "索引為" + index3);
    }
}    
    private static int method3(int[] nums, int target) {
        //這個最牛逼
        //減少循環(huán)內(nèi)的比較次數(shù)
        int left = 0, right = nums.length;
        while(1 < right - left){
            int mid = (left + right) >>> 1;
            if(nums[mid] > target){
                right = mid;
            }else{
                left = mid;
            }
        }
        if(nums[left] == target){
            return left;
        }
        return -1;
    }

BSLeftmost:

/**
 *
 * 應(yīng)用:求成績排名  求前任
 */
public class Leftmost {
    public static void main(String[] args) {
        int[] nums = {1,2,4,4,4,6,7};
        int target = 3;
        /***
         * params
         * return 找到了 - 返回靠左的下標(biāo)
         *        沒找到 - 返回>target的最靠左下標(biāo)
         */
        int ans = BSLeftmost(nums, target);
        System.out.println(ans);

    }

    private static int BSLeftmost(int[] nums, int target) {
        int left = 0, right = nums.length -1;
        while(left <= right){
            int mid = (left+right) >>> 1;
            if(target > nums[mid]){
                left = mid + 1;
            } else{
                right = mid - 1;
            }
        }
        return left;
    }
}

BSRightmost:

/**
 *
 * 求后任
 */
public class Rightmost {
    public static void main(String[] args) {
        int[] nums = {1,2,4,4,4,6,7};
        int target = 3;
        /**
         * return 找到了返回下標(biāo)
         *        沒找到返回 <= targer的最靠右索引
         *
         */
        int ans = BSRightmost(nums, target);
        System.out.println(ans);
    }

    private static int BSRightmost(int[] nums, int target) {
        int left = 0, right = nums.length-1;
        while(left <= right){
            int mid = (left + right) >>> 1;
            if(target >= nums[mid]){
                left = mid + 1;
            }else {
                right = mid - 1;
            }
        }
        return left - 1;
    }
}

到了這里,關(guān)于【手撕數(shù)據(jù)結(jié)構(gòu)】二分查找(好多細(xì)節(jié))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))

    數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))

    順序查找概念:從表的另一端開始,一次將記錄的和給定值進(jìn)行比較,若某個記錄的和給定的值相等,則查找成功,反之則查找失敗。 ASL:平均查找長度 pi查找概率,ci查找次數(shù) eg:序列1,2,3 查找1的次數(shù)為1概率為1/3,2為兩次概率1/3,3的次數(shù)為3概率1/3? 將12

    2024年02月06日
    瀏覽(28)
  • Python數(shù)據(jù)結(jié)構(gòu)與算法篇(五)-- 二分查找與二分答案

    Python數(shù)據(jù)結(jié)構(gòu)與算法篇(五)-- 二分查找與二分答案

    1.1 定義 ????????二分查找又稱折半查找、二分搜索、折半搜索等,是一種在靜態(tài)查找表中查找特定元素的算法。 ????????所謂靜態(tài)查找表,即只能對表內(nèi)的元素做查找和讀取操作,不允許插入或刪除元素。 ????????使用二分查找算法,必須保證查找表中存放的是有

    2023年04月20日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】python實(shí)現(xiàn)二分查找

    【數(shù)據(jù)結(jié)構(gòu)與算法】python實(shí)現(xiàn)二分查找

    二分查找 又稱折半查找,它是一種效率較高的查找方法 原理:首先,假設(shè)表中元素是按升序排列,將表中間位置記錄的與查找比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個子表,如果中間位置記錄的大于查找,則

    2024年02月05日
    瀏覽(32)
  • 數(shù)據(jù)結(jié)構(gòu)和算法之二分法查找

    二分法查找,也稱作 二分查找 或 折半查找 ,是一種在有序數(shù)組中快速查找特定元素的算法。它采用分治法思想,通過將問題劃分為規(guī)模更小的子問題,并且通過對子問題的查找來解決原問題。 二分法查找的思路是不斷地將數(shù)組一分為二,然后判斷目標(biāo)值在哪一部分,進(jìn)而

    2024年02月09日
    瀏覽(31)
  • 浙大數(shù)據(jù)結(jié)構(gòu)第一周01-復(fù)雜度3 二分查找

    本題要求實(shí)現(xiàn)二分查找算法。 函數(shù)接口定義: 其中 List 結(jié)構(gòu)定義如下: L 是用戶傳入的一個線性表,其中 ElementType 元素可以通過、==、進(jìn)行比較,并且題目保證傳入的數(shù)據(jù)是遞增有序的。函數(shù) BinarySearch 要查找 X 在 Data 中的位置,即數(shù)組下標(biāo)(注意:元素從下標(biāo)1開始存儲)

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

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

    2024年02月08日
    瀏覽(18)
  • 「算法」二分查找1:理論&細(xì)節(jié)

    「算法」二分查找1:理論&細(xì)節(jié)

    ?? 個人主頁 :Ice_Sugar_7 ?? 所屬專欄 :算法詳解 ?? 歡迎點(diǎn)贊收藏加關(guān)注哦! 這個算法的特點(diǎn)就是: 細(xì)節(jié)多,出錯率高,很容易就寫成死循環(huán) 有模板,但切記要 在理解的基礎(chǔ)上記憶 ,不要死記硬背。有三個模板,一個是本文要講的 簡單模板 ,另外兩個分別是 查找左、

    2024年02月20日
    瀏覽(24)
  • 【數(shù)據(jù)結(jié)構(gòu)】手撕排序

    【數(shù)據(jù)結(jié)構(gòu)】手撕排序

    ?? 博客主頁 : 小羊失眠啦. ?? 系列專欄 : 《C語言》 《數(shù)據(jù)結(jié)構(gòu)》 《Linux》 《Cpolar》 ?? 感謝大家點(diǎn)贊??收藏?評論?? 排序 :所謂排序就是使一串記錄,按照其中的某個或某些的大小, 遞增或遞減 的排列起來的操作。排序算法,就是如何使得記錄按照要求

    2024年02月05日
    瀏覽(34)
  • 數(shù)據(jù)結(jié)構(gòu)之——(手撕)順序表

    數(shù)據(jù)結(jié)構(gòu)之——(手撕)順序表

    本章會介紹的知識點(diǎn)如下圖: ? ? ? ? ? ? ? ? ? ?順序表的結(jié)構(gòu):邏輯結(jié)構(gòu)與物理結(jié)構(gòu)都是內(nèi)存中一塊連續(xù)開辟的空間,都是11對應(yīng)的線性結(jié)構(gòu)。 兩種定義順序表的方式代碼如下 ? ? ? ? 靜態(tài)的順序表???????? 動態(tài)的順序表: ???????? 在這兩種結(jié)構(gòu)中通常我們是會

    2024年02月11日
    瀏覽(29)
  • 【數(shù)據(jù)結(jié)構(gòu)】手撕單鏈表

    【數(shù)據(jù)結(jié)構(gòu)】手撕單鏈表

    目錄 一,鏈表的概念及結(jié)構(gòu) 二,接口實(shí)現(xiàn) ????????1,單鏈表的創(chuàng)建 ????????2,接口函數(shù) ????????3,動態(tài)創(chuàng)立新結(jié)點(diǎn) ????????4,打印 ????????5,頭插 ????????6,頭刪 ????????7,尾插 ????????8,尾刪 ????????9,查找 ????????10,單鏈表

    2024年02月10日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包