欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中的bisect模塊與二分查找詳情

 更新時(shí)間:2022年09月13日 16:58:43   作者:獨(dú)影月下酌酒  
這篇文章主要介紹了python中的bisect模塊與二分查找詳情,bisect是python的內(nèi)置模塊,?用于有序序列的插入和查找。?插入的數(shù)據(jù)不會(huì)影響列表的排序,更多詳細(xì)內(nèi)容需要的朋友可以參考一下

1.bisect模塊概述

bisect是python的內(nèi)置模塊, 用于有序序列的插入和查找。 插入的數(shù)據(jù)不會(huì)影響列表的排序, 但是原有列表需要是有序的, 并且不能是倒序.

Bisect模塊提供的函數(shù)有:

  • bisect.bisect_left(a,x, lo=0, hi=len(a))
  • bisect.bisect_right(a,x, lo=0, hi=len(a))
  • bisect.bisect(a, x,lo=0, hi=len(a))
  • bisect.insort_left(a,x, lo=0, hi=len(a))
  • bisect.insort_right(a,x, lo=0, hi=len(a))
  • bisect.insort(a, x,lo=0, hi=len(a))

2.bisect模塊的函數(shù)詳解

2.1 bisect.bisect*()方法

  • bisect.bisect_left(a,x,lo=0,hi=len(a),*,key=None)

在有序數(shù)組a中[lo,hi]區(qū)間內(nèi)查找x插入的位置,返回的是索引值。如果a中有跟x相同的元素,則x插入的位置是左邊,key指定了一個(gè)單參數(shù)的方法,該方法的返回值作為與k比較的基準(zhǔn)。

值得注意的是,key參數(shù)是3.10版本以后才添加的功能

  • bisect.bisect_right(a,x,lo=0,hi=len(a),*,key=None),在有序數(shù)組a中[lo,hi]區(qū)間內(nèi)查找x插入的位置,返回索引值。如果a中有跟x相同的元素,則x插入的位置是右邊。
  • bisect.bisect(a,x,lo=0,hi=len(a),*,key=None),同bisect_right
# bisect_left Vs. bisect (bisect_right)
import bisect

nums = [1, 2, 2, 4]
i, j = bisect.bisect_left(nums, 2), bisect.bisect(nums, 2)
print(i)  # 輸出1
print(j)  # 輸出3

可見(jiàn),針對(duì)上面給出的數(shù)組,想要插入2,使用bisect_left返回的索引值是1,使用bisect(bisect_right)返回的索引值是3。如果指定了lo和hi的話,那么返回的就是在這個(gè)范圍內(nèi)的索引。如下面的例子所示。

# 指定lo和hi
import bisect

nums = [1, 2, 2, 2, 2, 4]
i = bisect.bisect_left(nums, 2, 3)
print(i)  # 輸出為3

如果不指定lo=3的話,返回的索引應(yīng)該是1。指定lo=3后,返回的索引為3。

關(guān)鍵字key指定了一個(gè)方法,這個(gè)方法會(huì)接受當(dāng)前數(shù)組中的中間值mid(因?yàn)槎植檎揖褪菑闹虚g值開(kāi)始的)作為其參數(shù),然后返回一個(gè)值val,val用于跟x比較。

# 指定key值
import bisect

nums = [1, 2, 3, 4, 6, 8]

def divide(mid):
    print('mid: ' + str(mid))
    return mid // 2

i = bisect.bisect_left(nums, 5, key=divide)
print(i)

上面的例子中定義了一個(gè)divide方法。那么bisect_left方法的執(zhí)行順序是這樣的:

  • nums中的中間值mid=4, divide(mid)方法返回值為2
  • 5>2,則查找nums的右子數(shù)組,即[6,8]
  • [6,8]的中間值是mid=8, divide(mid)方法返回值為4
  • 5>4,則繼續(xù)查找右子數(shù)組,可是已經(jīng)沒(méi)有右子數(shù)組了,則返回索引值為6.

2.2 bisect.insort*()方法

  • bisect.insort_left(a,x,lo=0,hi=len(a),*,key=None),在有序數(shù)組a中[lo,hi]區(qū)間內(nèi)查找x插入的位置,返回的是索引值。如果a中有跟x相同的元素,則x插入的位置是最左邊,key指定了一個(gè)單參數(shù)的方法,該方法的返回值作為與k比較的基準(zhǔn)。
  • bisect.insort_right(a,x,lo=0,hi=len(a),*,key=None),在有序數(shù)組a中[lo,hi]區(qū)間內(nèi)查找x插入的位置,返回索引值。如果a中有跟x相同的元素,則x插入的位置是最右邊。
  • bisect.insort(a,x,lo=0,hi=len(a),*,key=None),同insort_right。
# bisect.insort_left
import bisect

nums = [1, 2, 3, 4, 6, 8]
bisect.insort_left(nums, 5)
print(nums)
# [1, 2, 3, 4, 5, 6, 8]

值得注意的是,insort方法中的key和bisect方法中的key指定的方法針對(duì)的對(duì)象是不同的。

# bisect.insort_left with key
import bisect

nums = [1, 2, 3, 4, 6, 8]
def divide(mid):
    print('mid: ' + str(mid))
    return mid // 2
bisect.insort_left(nums, 5, key=divide)

可見(jiàn),key指定的方法的參數(shù)是針對(duì)x的。也就是說(shuō)insort_left方法的執(zhí)行順序是這樣的:

  • mid=x=5,返回的值是2,也就是divide(x)
  • mid是數(shù)組的中間值,即mid=4, divide方法返回的值是2
  • divide(x)==2,則查找左子數(shù)組
  • 中間值為2,mid=2, divide方法返回的值是1
  • divide(x)>1,則查找右子數(shù)組
  • 中間值為3,mid=3, divide方法的返回值是1
  • divide(x)>1,則查找右子數(shù)組
  • 沒(méi)有右子數(shù)組了,則插入位置的索引為3,得到了插入5之后的數(shù)組為[1,2,3,5,4,6,8]

3.python中的二分查找

3.1 標(biāo)準(zhǔn)的二分查找

class BinarySearch:
    # 標(biāo)準(zhǔn)的二分查找,找不到返回-1
    def binsearch(self, 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

3.2 查找第一個(gè)>=target的元素索引

class BinarySearch:
    # 查找第一個(gè)>=target的元素索引,找不到返回?cái)?shù)組長(zhǎng)度
    def lowerbound(self, 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

3.3 查找第一個(gè)>target的元素索引

class BinarySearch:
    # 查找第一個(gè)>target的元素索引,找不到返回?cái)?shù)組長(zhǎng)度
    def upperbound(self, 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

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

  • 二分查找中的 lowerbound(nums, target) 等價(jià)于 bisect.bisect_left(a,x, lo=0, hi=len(a))
  • 二分查找中的upperbound(nums, target) 等價(jià)于 bisect.bisect_right(a,x, lo=0, hi=len(a)) 或者bisect.bisect(a,x, lo=0, hi=len(a))

到此這篇關(guān)于python中的bisect模塊與二分查找詳情的文章就介紹到這了,更多相關(guān)python bisect模塊 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析Python的命名空間與作用域

    淺析Python的命名空間與作用域

    這篇文章主要介紹了Python的命名空間與作用域的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-11-11
  • 使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器與抽簽工具

    使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器與抽簽工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器,也可以用作抽簽工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • python實(shí)現(xiàn)簡(jiǎn)單的井字棋小游戲

    python實(shí)現(xiàn)簡(jiǎn)單的井字棋小游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單的井字棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Python中的type與isinstance的區(qū)別詳解

    Python中的type與isinstance的區(qū)別詳解

    本文主要介紹了Python中的type與isinstance的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 一文詳解Python中subprocess模塊的用法

    一文詳解Python中subprocess模塊的用法

    Python的subprocess模塊是一個(gè)非常強(qiáng)大的工具,用于啟動(dòng)和與外部進(jìn)程進(jìn)行交互,本文將為大家詳細(xì)介紹?subprocess模塊的各個(gè)方面,希望對(duì)大家有所幫助
    2023-11-11
  • 用Python制作一個(gè)可以聊天的皮卡丘版桌面寵物

    用Python制作一個(gè)可以聊天的皮卡丘版桌面寵物

    這篇文章主要為大家介紹如何利用Python制作一個(gè)可愛(ài)的皮卡丘桌面掛件寵物,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-03-03
  • Python如何將jpg圖像修改大小并轉(zhuǎn)換為png

    Python如何將jpg圖像修改大小并轉(zhuǎn)換為png

    這篇文章主要介紹了Python如何將jpg圖像修改大小并轉(zhuǎn)換為png問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 如何基于Python實(shí)現(xiàn)數(shù)字類型轉(zhuǎn)換

    如何基于Python實(shí)現(xiàn)數(shù)字類型轉(zhuǎn)換

    這篇文章主要介紹了如何基于Python實(shí)現(xiàn)數(shù)字類型轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python運(yùn)算符教程之邏輯門(mén)詳解

    Python運(yùn)算符教程之邏輯門(mén)詳解

    邏輯門(mén)是任何數(shù)字電路的基本構(gòu)建塊。它需要一兩個(gè)輸入并根據(jù)這些輸入產(chǎn)生輸出。本文將通過(guò)示例和大家講講Python中的7個(gè)基本邏輯門(mén),感興趣的可以了解一下
    2022-09-09
  • python logging添加filter教程

    python logging添加filter教程

    今天小編就為大家分享一篇python logging添加filter教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12

最新評(píng)論