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

折半查找(二分查找)的兩種方法及實現(xiàn) Python

這篇具有很好參考價值的文章主要介紹了折半查找(二分查找)的兩種方法及實現(xiàn) Python。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

概念:

在計算機科學(xué)中,折半查找,也稱二分查找,是一種在有序數(shù)組中查找某一特定元素的搜索算法。
搜索過程從數(shù)組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結(jié)束;如果某一特定元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數(shù)組為空,則代表找不到。
因為每次查找后,每一次比較都使搜索范圍縮小一半,故得名二分/折半查找。

特點:

  • 折半查找法的優(yōu)點是比較次數(shù)少,查找速度快,平均性能好;
  • 其缺點是要求待查表為有序表,且插入刪除困難。
  • 因此,折半查找方法適用于不經(jīng)常變動而查找頻繁的有序列表。
  • 總結(jié):當(dāng)列表為有序升序不重復(fù)時,推薦使用折半查找。

算法:

① 首先確定整個查找區(qū)間的中間位置 mid = (left + right) /2 。
② 用待查關(guān)鍵字值與中間位置的關(guān)鍵字值進(jìn)行比較;若相等,則查找成功;若大于,則在后(右)半個區(qū)域繼續(xù)進(jìn)行折半查找;若小于,則在前(左)半個區(qū)域繼續(xù)進(jìn)行折半查找。
③ 對確定的縮小區(qū)域再按折半公式,重復(fù)上述步驟。最后,得到結(jié)果:要么查找成功, 要么查找失敗。

折半查找,區(qū)間的定義一般為兩種,左閉右閉即[left, right],或者左閉右開即[left, right)。下面我將兩種方法分別為大家做詳細(xì)解讀。

一、左閉右閉 [left, right]

思路:

第一種寫法,我們定義 target 是在一個在左閉右閉的區(qū)間里,也就是 [left, right] (這個很重要非常重要)。

區(qū)間的定義這就決定了折半法的代碼應(yīng)該如何寫,因為定義target在[left, right]區(qū)間,所以有如下兩點:

  • while (left <= right) 要使用 <= ,因為left == right是可以實際取到的,是有意義的,所以使用 <= 。
  • if (nums[middle] > target) right 要賦值為 middle - 1,因為當(dāng)前這個nums[middle]一定不是target,那么接下來要查找的左區(qū)間結(jié)束下標(biāo)位置就是 middle - 1 。

下面給出具體實現(xiàn)代碼:

nums = [1,2,3,4,5,6,7,8,9,10,11,22,33,44,65,546,5432]
target = int(input("請輸入目標(biāo)數(shù)字"))
left = 0
right = len(nums) - 1
while (left <= right):
    middle = (left + right ) // 2
    if (nums[middle] > target):
        right = middle - 1
    elif (nums[middle] < target):
        left = middle + 1 
    elif(nums[middle] == target):
        print(middle)
        break  // 很重要,否則陷入無限循環(huán)
else:
     print(-1)  #未找到該元素

二、左閉右開 [left, right)

思路:

這種方法將 target 定義在一個在左閉右開的區(qū)間里,也就是[left, right)。需要注意,此時右邊界是取不到的。需要注意下面兩點:

  • while (left < right),這里使用 < ,因為left == right 是沒有意義的,因為區(qū)間[left, right)無法被實際取到。
  • if (nums[middle] > target) right 更新為 middle,因為當(dāng)前nums[middle]不等于target,去左區(qū)間繼續(xù)尋找,而尋找區(qū)間是左閉右開區(qū)間,所以right更新為middle,即:下一個查詢區(qū)間不會去比較nums[middle]。

下面給出具體實現(xiàn)代碼:

nums = [1,2,3,4,5,6,7,8,9,10,11,22,33,44,65,546,5432]
target = int(input("請輸入目標(biāo)數(shù)字"))
left = 0
right = len(nums)
while left < right:
    middle = (left+right) // 2
    num = nums[middle]
    if num < target:
        left = middle + 1
    elif num > target:
        right = middle
    else:
        print(middle)
        break // 很重要,否則陷入無限循環(huán)
else:
    print(-1) #未找到該元素

總結(jié):

區(qū)間的定義就是不變量,那么在循環(huán)中堅持根據(jù)查找區(qū)間的定義來做邊界處理,就是循環(huán)不變量規(guī)則。折半查找中最重要的就是區(qū)間的選擇和邊界的確定。記住一點。考察區(qū)間是否存在,是否有實際意義,這樣在寫代碼的時候就不會模糊。文章來源地址http://www.zghlxwxcb.cn/news/detail-485503.html

到了這里,關(guān)于折半查找(二分查找)的兩種方法及實現(xiàn) Python的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 圖像處理(1):用Python實現(xiàn)彩色圖像轉(zhuǎn)為灰度圖像的兩種方法以及批量將圖片轉(zhuǎn)為灰度圖

    圖像處理(1):用Python實現(xiàn)彩色圖像轉(zhuǎn)為灰度圖像的兩種方法以及批量將圖片轉(zhuǎn)為灰度圖

    用Python實現(xiàn)彩色圖像轉(zhuǎn)為灰度圖像的兩種方法介紹 這篇文章給大家主要介紹使用 Python 將彩色圖像轉(zhuǎn)為灰度圖像的兩種方法,以及用 Python 批量將圖片轉(zhuǎn)為灰度圖的方法,供大家參考: 使用Python中的cv2庫,它自帶彩色轉(zhuǎn)灰度的方法,并且代碼非常簡單。 先讀取一張彩色圖片,然

    2024年02月11日
    瀏覽(28)
  • Python創(chuàng)建多線程的兩種常用方法

    Python創(chuàng)建多線程的兩種常用方法

    這篇文章主要為大家詳細(xì)介紹了Python中創(chuàng)建多線程的兩種常用方法,文中的示例代碼簡潔易懂,對我們掌握Python有一定的幫助,需要的可以收藏一下 經(jīng)過總結(jié),Python創(chuàng)建多線程主要有如下兩種方法: 函數(shù) 類 接下來,我們就來揭開多線程的神秘面紗。 在Python3中,Python提供了

    2024年02月15日
    瀏覽(25)
  • python元組tuple添加元素的兩種方法

    方法一 :可以使用python內(nèi)置的__add__()方法,使用該方法為python元組添加元素時,需要使用元組來對象來進(jìn)行調(diào)用,然后將需要添加的元素,以元組的數(shù)據(jù)類型進(jìn)行傳遞,該方法并需修改調(diào)用對象,而是以新的元組進(jìn)行返回,具體可見下方的實例代碼。 方法二 :將python的元組

    2024年02月12日
    瀏覽(28)
  • 查找:線性表的C語言代碼實現(xiàn)(順序查找、折半查找)

    查找:線性表的C語言代碼實現(xiàn)(順序查找、折半查找)

    一、線性表結(jié)構(gòu) 兩個類的定義 二、線性表的初始化以及根據(jù)輸入的元素建立線性表 1.線性表的初始化,初始化一個空的線性表 2.根據(jù)用戶需求,向線性表中添加元素? 三、順序查找? Search1函數(shù)(沒有設(shè)置哨兵,需要比較兩次) 四、順序查找(設(shè)置哨兵,不用再比較是否會越

    2024年02月09日
    瀏覽(27)
  • RabbitMQ實現(xiàn)延時消息的兩種方法

    RabbitMQ實現(xiàn)延時消息的兩種方法

    1、死信隊列 1.1消息什么時候變?yōu)樗佬?dead-letter) 消息被否定接收,消費者使用basic.reject 或者 basic.nack并且requeue 重回隊列屬性設(shè)為false。 消息在隊列里得時間超過了該消息設(shè)置的過期時間(TTL)。 消息隊列到達(dá)了它的最大長度,之后再收到的消息。 1.2死信隊列的原理 當(dāng)一個

    2024年02月10日
    瀏覽(37)
  • 關(guān)于 python 在 pycharm 下載庫的兩種方法

    關(guān)于 python 在 pycharm 下載庫的兩種方法

    正常操作: 1.點擊左上角File 。 ?2.點擊setting,進(jìn)入設(shè)置界面 。 3.點擊python Interpreter。 ?4.添加新庫時,點擊右上側(cè) “ + ” 號,出現(xiàn)新界面。 ?5,在搜索框搜索想添加的庫,點擊左下角 Instal? Package , 等待完成即可。 特殊情況: ?此時可能出現(xiàn)失敗情況 直接打開電腦搜索欄,

    2024年02月12日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】python實現(xiàn)二分查找

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

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

    2024年02月05日
    瀏覽(32)
  • Moqui REST API的兩種實現(xiàn)方法

    Moqui REST API的兩種實現(xiàn)方法

    實現(xiàn)Restful API的方法? 實現(xiàn)REST API有兩種方法。 第一種: The main tool for building a REST API based on internal services and entity operations is to define resource paths in a? Service REST API ?XML file such as the? moqui.rest.xml ?file in? moqui-framework ?and the? mantle.rest.xml ?file in? mantle-usl . With your own Service RES

    2024年02月02日
    瀏覽(25)
  • 【算法集訓(xùn)】基礎(chǔ)算法:二分查找 | 概念篇

    【算法集訓(xùn)】基礎(chǔ)算法:二分查找 | 概念篇

    二分枚舉,也叫二分查找,指的就是給定一個區(qū)間,每次選擇區(qū)間的中點,并且判斷區(qū)間中點是否滿足某個條件,從而選擇左區(qū)間繼續(xù)求解還是右區(qū)間繼續(xù)求解,直到區(qū)間長度不能再切分為止。 由于每次都是把區(qū)間折半,又叫折半查找,時間復(fù)雜度為 O(logn),和線性枚舉的求

    2024年04月11日
    瀏覽(35)
  • vscode運行Python的兩種方法,及無法運行的原因

    下面介紹的vscode運行Python代碼的方法基于的一個前提條件是:當(dāng)前的計算機已經(jīng)安裝好了Python,且已經(jīng)配置好了相關(guān)的環(huán)境變量。如果要查看是否已經(jīng)都安裝好了,可以打開Windows系統(tǒng)的命令行工具Windows PowerShell,如果是Mac系統(tǒng)或Linux系統(tǒng),則可以打開終端,然后鍵入命令:

    2024年01月21日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包