二分查找及其變形與Python的bisect模塊的關(guān)系

首先禀崖,我們完成了二分查找及其變形的 3 個(gè)函數(shù)的模板:

1、binsearch(nums, target):標(biāo)準(zhǔn)的二分查找螟炫,找不到返回-1波附;
2、lowerbound(nums, target):查找第一個(gè)>=target的元素索引昼钻,找不到返回?cái)?shù)組長度掸屡;
3、upperbound(nums, target):查找第一個(gè)>target的元素索引然评,找不到返回?cái)?shù)組長度仅财。

class BinarySearch:

    # 標(biāo)準(zhǔn)的二分查找,找不到返回-1
    def binsearch(nums, target):
        lo, hi = 0, len(nums) - 1
        while lo <= hi:
            mid = lo + (hi - lo) // 2
            if nums[mid] == target:
                return mid
            elif nums[mid] > target:
                hi = mid - 1
            else:  # nums[mid] < target:
                lo = mid + 1
        return -1

    # 查找第一個(gè)>=target的元素索引碗淌,找不到返回?cái)?shù)組長度
    def lowerbound(nums, target):
        lo, hi = 0, len(nums) - 1
        pos = len(nums)  # 找不到
        while lo < hi:
            mid = lo + (hi - lo) // 2
            if nums[mid] >= target:
                hi = mid
            else:  # nums[mid] < target:
                lo = mid + 1
        if nums[lo] >= target: # lo就是要找的元素索引
            pos = lo
        return pos

    # 查找第一個(gè)>target的元素索引盏求,找不到返回?cái)?shù)組長度
    def upperbound(nums, target):
        lo, hi = 0, len(nums) - 1
        pos = len(nums)  # 找不到
        while lo < hi:
            mid = lo + (hi - lo) // 2
            if nums[mid] > target:
                hi = mid
            else:  # nums[mid] <= target:
                lo = mid + 1
        if nums[lo] > target: # lo就是要找的元素索引
            pos = lo
        return pos

然后抖锥,我們介紹 Python 的 bisect 模塊(import bisect):

先說明的是,使用這個(gè)模塊的函數(shù)前先確保操作的列表是已排序的碎罚。

  • 有 3 個(gè)函數(shù):bisect.bisect(list, val)磅废、bisect.bisect_left(list, val)bisect.bisect_right(list, val)荆烈,功能是在有序數(shù)組 list 中返回 val 插入位置的索引(不改變 list 本身)拯勉,后兩者適合包含重復(fù)元素的情況。實(shí)際上耙考,bisect.bisect(list, val) 等價(jià)于 bisect.bisect_right(list, val)谜喊。
import bisect
a = [1,1,2,2,2,2,3,4,4,5,5,6,6,6]
print(bisect.bisect(a, 0))  # 1
print(bisect.bisect_left(a, 6))  # 11
print(bisect.bisect_right(a, 2))  # 6
  • 有 3 個(gè)函數(shù):bisect.insort(list, val)bisect.insort_left(list, val)倦始、bisect.insort_right(list, val)斗遏,功能是在有序數(shù)組 list 中插入 val (會改變 list 本身)。單純看其結(jié)果的話鞋邑,3 個(gè)函數(shù)的操作結(jié)果是一樣的诵次,其實(shí)插入的位置不同而已。
import bisect
a = [1,1,2,2,2,2,3,4,4,5,5,6,6,6]
bisect.bisect(a, 0)  # a = [0,1,1,2,2,2,2,3,4,4,5,5,6,6,6]
bisect.bisect_left(a, 6)  # a = [0,1,1,2,2,2,2,3,4,4,5,5,6,6,6,6]
bisect.bisect_right(a, 2)  # a = [0,1,1,2,2,2,2,2,3,4,4,5,5,6,6,6,6]

二分查找的變形與 bisect 模塊的關(guān)系:

1枚碗、二分查找中的 lowerbound(nums, target) 函數(shù)等價(jià)于 bisect.bisect_left(list, val)逾一;
2、二分查找中的 upperbound(nums, target) 函數(shù)等價(jià)于 bisect.bisect_right(list, val)bisect.bisect(list, val)肮雨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遵堵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子怨规,更是在濱河造成了極大的恐慌陌宿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件波丰,死亡現(xiàn)場離奇詭異壳坪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掰烟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門爽蝴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纫骑,你說我怎么就攤上這事蝎亚。” “怎么了惧磺?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵颖对,是天一觀的道長。 經(jīng)常有香客問我磨隘,道長缤底,這世上最難降的妖魔是什么顾患? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮个唧,結(jié)果婚禮上江解,老公的妹妹穿的比我還像新娘。我一直安慰自己徙歼,他們只是感情好犁河,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著魄梯,像睡著了一般桨螺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酿秸,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天灭翔,我揣著相機(jī)與錄音,去河邊找鬼辣苏。 笑死肝箱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稀蟋。 我是一名探鬼主播煌张,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼退客!你這毒婦竟也來了骏融?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萌狂,失蹤者是張志新(化名)和其女友劉穎绎谦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粥脚,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年包个,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刷允。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碧囊,死狀恐怖树灶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情糯而,我是刑警寧澤天通,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站熄驼,受9級特大地震影響像寒,放射性物質(zhì)發(fā)生泄漏烘豹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一诺祸、第九天 我趴在偏房一處隱蔽的房頂上張望携悯。 院中可真熱鬧,春花似錦筷笨、人聲如沸憔鬼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轴或。三九已至,卻和暖如春仰禀,著一層夾襖步出監(jiān)牢的瞬間照雁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工悼瘾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留囊榜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓亥宿,卻偏偏與公主長得像卸勺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子烫扼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Python 的列表(list)內(nèi)部實(shí)現(xiàn)是一個(gè)數(shù)組曙求,也就是一個(gè)線性表。在列表中查找元素可以使用 list.inde...
    派派森森閱讀 750評論 0 3
  • 簡介 二分查找(Binary Search)算法映企,也叫折半查找算法悟狱。在給順序表結(jié)構(gòu)中(也就是數(shù)組)快速查找某一個(gè)值...
    mah93閱讀 577評論 0 0
  • 原文鏈接: 點(diǎn)這里更多內(nèi)容就在我的個(gè)人博客 BlackBlog.tech 歡迎關(guān)注!謝謝大家堰氓! 本文源自LeetC...
    BlackBlog__閱讀 3,265評論 2 13
  • 動態(tài)規(guī)劃 111. 爬樓梯思路類似斐波那契數(shù)列注意考慮第 0 階的特殊情況 272. 爬樓梯 II思路類似上題挤渐,只...
    6默默Welsh閱讀 2,431評論 0 1
  • Scala的集合類可以從三個(gè)維度進(jìn)行切分: 可變與不可變集合(Immutable and mutable coll...
    時(shí)待吾閱讀 5,823評論 0 4