最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)二分法查找及優(yōu)化的示例詳解

 更新時間:2023年04月20日 10:37:50   作者:Python?集中營  
二分查找法(Binary?Search)是一種在有序數(shù)組中查找某一特定元素的算法,在本文中,我們將使用?Python?實現(xiàn)二分查找算法,并深入探討算法的原理和實現(xiàn)細節(jié),感興趣的可以了解一下

二分查找法(Binary Search)是一種在有序數(shù)組中查找某一特定元素的算法,它的思想是將數(shù)組從中間分成兩部分,判斷目標(biāo)元素在哪一部分中,然后繼續(xù)在相應(yīng)的部分中進行查找,直到找到目標(biāo)元素或者確定目標(biāo)元素不存在為止。

在本文中,我們將使用 Python 實現(xiàn)二分查找算法,并深入探討算法的原理和實現(xiàn)細節(jié)。

1.二分查找的原理

二分查找法適用于有序數(shù)組中查找某一特定元素的場景,它的原理是將有序數(shù)組分成兩個部分,每次取中間位置的元素與目標(biāo)元素進行比較,根據(jù)比較結(jié)果確定要查找的元素在左邊部分還是右邊部分,然后繼續(xù)在相應(yīng)的部分中進行查找。

這樣每次都能將待查找區(qū)間縮小一半,直到找到目標(biāo)元素或者確定目標(biāo)元素不存在為止。

二分查找法的時間復(fù)雜度為 O(log n),其中 n 表示數(shù)組的長度。這是因為每次查找都將查找區(qū)間縮小一半,最壞情況下需要查找 log n 次。

2.二分查找的實現(xiàn)

接下來,我們將使用 Python 實現(xiàn)二分查找算法。首先,我們定義一個函數(shù)binary_search,接收兩個參數(shù):一個有序數(shù)組 arr 和一個目標(biāo)元素 target。

函數(shù)返回目標(biāo)元素在數(shù)組中的下標(biāo),如果不存在則返回 -1。

def?binary_search(arr,?target):
????left?=?0
????right?=?len(arr)?-?1
????while?left?<=?right:
????????mid?=?(left?+?right)?//?2
????????if?arr[mid]?==?target:
????????????return?mid
????????elif?arr[mid]?<?target:
????????????left?=?mid?+?1
????????else:
????????????right?=?mid?-?1
????return?-1

在這個函數(shù)中,我們定義了兩個指針 left 和 right,分別指向數(shù)組的第一個元素和最后一個元素。

然后,我們進入一個循環(huán),直到 left > right 為止。在每次循環(huán)中,我們計算中間位置的下標(biāo) mid,并將 arr[mid] 與 target 進行比較。

如果 arr[mid] 等于 target,說明我們已經(jīng)找到了目標(biāo)元素,直接返回 mid。如果 arr[mid] 小于 target,說明目標(biāo)元素在右邊部分,我們將 left 指針移到 mid 的右邊一位。

如果 arr[mid] 大于 target,說明目標(biāo)元素在左邊部分,我們將 right 指針移到 mid 的左邊一位。這樣不斷縮小查找區(qū)間,直到找到目標(biāo)元素或者確定目標(biāo)元素不存在為止。下面是一個使用例子:

arr?=?[1,?3,?5,?7,?9]
target?=?7
result?=?binary_search(arr,?target)
if?result?==?-1:
????print("Element?is?not?present?in?array")
else:
????print("Element?is?present?at?index",?result)

在這個例子中,我們定義了一個有序數(shù)組 arr 和一個目標(biāo)元素 target,并調(diào)用了 binary_search 函數(shù)。

如果目標(biāo)元素存在于數(shù)組中,函數(shù)將返回目標(biāo)元素在數(shù)組中的下標(biāo);否則返回 -1。

在這個例子中,目標(biāo)元素 7 存在于數(shù)組中,函數(shù)將輸出 “Element is present at index 3”。

3.二分查找的優(yōu)化

雖然二分查找法的時間復(fù)雜度為 O(log n),但是在實際應(yīng)用中,我們可以通過一些優(yōu)化來進一步提高算法的效率。

(1)查找區(qū)間的左右邊界

在二分查找法中,我們需要定義一個查找區(qū)間,通常用 left 和 right 兩個指針來表示。

在每次循環(huán)中,我們需要判斷 left 和 right 是否重合,如果重合則說明查找區(qū)間為空,目標(biāo)元素不存在于數(shù)組中。

這個判斷過程需要進行多次,可以通過在循環(huán)條件中直接判斷 left 和 right 是否相鄰來減少判斷次數(shù),如下所示:

while?left?<?right:
????mid?=?(left?+?right)?//?2
????if?arr[mid]?==?target:
????????return?mid
????elif?arr[mid]?<?target:
????????left?=?mid?+?1
????else:
????????right?=?mid?-?1
if?arr[left]?==?target:
????return?left
else:
????return?-1

在這個優(yōu)化中,我們將循環(huán)條件改為 left < right,這樣每次循環(huán)結(jié)束后,left 和 right 最多相差 1。

在循環(huán)結(jié)束后,我們需要判斷 left 和 right 是否指向目標(biāo)元素。如果 arr[left] 等于 target,則說明目標(biāo)元素存在于數(shù)組中,返回 left;否則返回 -1。

(2)位運算代替除法運算

在計算中間位置的下標(biāo) mid 時,我們通常使用除法運算符 //。然而,除法運算符比位運算符效率低得多,因此我們可以使用位運算符 >> 來代替除法運算符 //,如下所示:

mid?=?(left?+?right)?>>?1

在這個優(yōu)化中,我們將除以 2 改為右移 1 位,即將二進制數(shù)向右移動一位,相當(dāng)于除以 2。這樣可以減少計算中間位置的下標(biāo)所需的時間。

(3)使用 bisect 庫

Python 中的 bisect 庫提供了一些實用的函數(shù),可以幫助我們更方便地進行二分查找。

其中,bisect_left 函數(shù)和 bisect_right 函數(shù)分別用于在有序數(shù)組中查找某一元素的插入位置。

這兩個函數(shù)的區(qū)別在于,當(dāng)有多個相同的元素時,bisect_left 函數(shù)返回第一個位置,而 bisect_right 函數(shù)返回最后一個位置。

下面是一個使用 bisect 庫進行二分查找的例子:

import?bisect
arr?=?[1,?3,?5,?7,?9]
target?=?7
index?=?bisect.bisect_left(arr,?target)
if?index?<?len(arr)?and?arr[index]?==?target:
????print("Element?is?present?at?index",?index)
else:
????print("Element?is?not?present?in?array")

在這個例子中,我們使用 bisect.bisect_left 函數(shù)在有序數(shù)組 arr 中查找目標(biāo)元素 target 的插入位置。

如果插入位置小于數(shù)組長度,并且插入位置處的元素等于目標(biāo)元素,則說明目標(biāo)元素存在于數(shù)組中,輸出其下標(biāo);否則輸出 “Element is not present in array”。

4.總結(jié)

二分查找法是一種高效的查找算法,適用于有序數(shù)組中查找某一特定元素的場景。通過將數(shù)組從中間分成兩部分,每次取中間位置的元素與目標(biāo)元素進行比較,可以將待查找區(qū)間縮小一半,從而降低查找的時間復(fù)雜度。

在實現(xiàn)二分查找算法時,我們需要定義一個查找區(qū)間,通常用 left 和 right 兩個指針來表示。在每次循環(huán)中,我們計算中間位置的下標(biāo) mid,并將 arr[mid] 與 target 進行比較。如果 arr[mid] 等于 target,說明我們已經(jīng)找到了目標(biāo)元素,直接返回 mid。

如果 arr[mid] 小于 target,說明目標(biāo)元素在右邊部分,我們將 left 指針移到 mid 的右邊一位。如果 arr[mid] 大于 target,說明目標(biāo)元素在左邊部分,我們將 right 指針移到 mid 的左邊一位。這樣不斷縮小查找區(qū)間,直到找到目標(biāo)元素或者確定目標(biāo)元素不存在為止。

在實際應(yīng)用中,我們可以通過一些優(yōu)化來進一步提高算法的效率。例如,可以在循環(huán)條件中直接判斷 left 和 right 是否相鄰來減少判斷次數(shù);可以使用位運算符 >> 來代替除法運算符 //,減少計算中間位置的下標(biāo)所需的時間;可以使用 bisect 庫提供的函數(shù)來進行二分查找,更方便地實現(xiàn)算法。

到此這篇關(guān)于Python實現(xiàn)二分法查找及優(yōu)化的示例詳解的文章就介紹到這了,更多相關(guān)Python二分法查找內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 記錄一下scrapy中settings的一些配置小結(jié)

    記錄一下scrapy中settings的一些配置小結(jié)

    這篇文章主要介紹了記錄一下scrapy中settings的一些配置小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Python3+Appium安裝使用教程

    Python3+Appium安裝使用教程

    這篇文章主要介紹了Python3+Appium安裝使用教程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python爬取成語接龍類網(wǎng)站

    Python爬取成語接龍類網(wǎng)站

    在本篇文章里我們給大家分享了關(guān)于Python爬取成語接龍類網(wǎng)站的相關(guān)知識點,有需要的朋友們學(xué)習(xí)下。
    2018-10-10
  • python使用websocket庫發(fā)送WSS請求

    python使用websocket庫發(fā)送WSS請求

    WebSocket是一種在客戶端和服務(wù)器之間進行雙向通信的協(xié)議,Python中有許多WebSocket庫可供選擇,其中一個常用的是websocket庫,使用該庫可以輕松地發(fā)送WSS請求,需要的朋友可以參考下
    2023-10-10
  • Linux下用Python腳本監(jiān)控目錄變化代碼分享

    Linux下用Python腳本監(jiān)控目錄變化代碼分享

    這篇文章主要介紹了Linux下用Python腳本監(jiān)控目錄變化代碼分享,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-05-05
  • 教你用python實現(xiàn)一個無界面的小型圖書管理系統(tǒng)

    教你用python實現(xiàn)一個無界面的小型圖書管理系統(tǒng)

    今天帶大家學(xué)習(xí)怎么用python實現(xiàn)一個無界面的小型圖書管理系統(tǒng),文中有非常詳細的圖文解說及代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Python線性網(wǎng)絡(luò)實現(xiàn)分類糖尿病病例

    Python線性網(wǎng)絡(luò)實現(xiàn)分類糖尿病病例

    什么是線性規(guī)劃?想象一下,您有一個線性方程組和不等式系統(tǒng)。這樣的系統(tǒng)通常有許多可能的解決方案。線性規(guī)劃是一組數(shù)學(xué)和計算工具,可讓您找到該系統(tǒng)的特定解,該解對應(yīng)于某些其他線性函數(shù)的最大值或最小值
    2022-10-10
  • 如何使用Python多線程測試并發(fā)漏洞

    如何使用Python多線程測試并發(fā)漏洞

    這篇文章主要介紹了如何使用Python多線程測試并發(fā)漏洞,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • 詳解基于python的多張不同寬高圖片拼接成大圖

    詳解基于python的多張不同寬高圖片拼接成大圖

    這篇文章主要介紹了詳解基于python的多張不同寬高圖片拼接成大圖,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Python給對象數(shù)組排序的方法實現(xiàn)

    Python給對象數(shù)組排序的方法實現(xiàn)

    本文主要介紹了Python給對象數(shù)組排序的方法實現(xiàn),可以使用sorted()函數(shù)或list.sort()方法來對對象數(shù)組按照第二個值進行排序,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03

最新評論

常熟市| 天峨县| 怀安县| 迁西县| 衡阳市| 海盐县| 罗平县| 集贤县| 泸州市| 南京市| 桓台县| 南溪县| 梅河口市| 洪雅县| 房产| 阜宁县| 丹阳市| 苏尼特左旗| 广宗县| 黎城县| 前郭尔| 兴义市| 四川省| 新化县| 抚松县| 客服| 山阳县| 雅安市| 怀宁县| 新龙县| 新巴尔虎右旗| 凤山县| 原平市| 中方县| 张北县| 宁津县| 于田县| 涡阳县| 沾化县| 色达县| 九寨沟县|