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

【Python查找算法】二分查找、線性查找、哈希查找

這篇具有很好參考價(jià)值的文章主要介紹了【Python查找算法】二分查找、線性查找、哈希查找。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

1 二分查找算法

?2 線性查找算法

3 哈希查找算法


1 二分查找算法

????????二分查找(Binary Search)是一種用于在有序數(shù)據(jù)集合中查找特定元素的高效算法。它的工作原理基于將數(shù)據(jù)集合分成兩半,然后逐步縮小搜索范圍,直到找到目標(biāo)元素或確定目標(biāo)元素不存在。

【Python查找算法】二分查找、線性查找、哈希查找,Python算法30篇,算法,python

以下是二分查找的工作原理的詳細(xì)說(shuō)明:?

  1. 有序數(shù)據(jù)集合:首先,數(shù)據(jù)集合必須是有序的,通常是按升序或降序排列的。這一點(diǎn)非常重要,因?yàn)槎植檎业暮诵乃枷胧歉鶕?jù)中間元素與目標(biāo)元素的大小關(guān)系來(lái)確定搜索范圍。

  2. 初始化指針:初始化兩個(gè)指針,一個(gè)指向數(shù)據(jù)集合的第一個(gè)元素(左指針),另一個(gè)指向最后一個(gè)元素(右指針)。

  3. 確定中間元素:計(jì)算左指針和右指針的中間位置,即 (left + right) // 2。這將確定搜索區(qū)域的中間元素。

  4. 比較中間元素:將中間元素與目標(biāo)元素進(jìn)行比較:

    • 如果中間元素等于目標(biāo)元素,搜索成功,返回中間元素的索引。
    • 如果中間元素大于目標(biāo)元素,說(shuō)明目標(biāo)元素應(yīng)該在左半部分,將右指針移到中間元素的左側(cè)一位,即 right = mid - 1。
    • 如果中間元素小于目標(biāo)元素,說(shuō)明目標(biāo)元素應(yīng)該在右半部分,將左指針移到中間元素的右側(cè)一位,即 left = mid + 1。
  5. 重復(fù)步驟3和4:在每次比較后,縮小搜索范圍,繼續(xù)比較直到找到目標(biāo)元素或搜索范圍為空(即左指針大于右指針)。

  6. 返回結(jié)果:如果找到目標(biāo)元素,返回它的索引;如果搜索范圍為空仍未找到目標(biāo)元素,返回一個(gè)指示未找到的值(通常是 -1)。

以下是一個(gè)簡(jiǎn)單的示例,演示如何使用二分查找在有序數(shù)組中查找目標(biāo)元素:

def binary_search(arr, target):
    left, right = 0, len(arr) - 1  # 初始化左右指針,分別指向數(shù)組的起始和結(jié)束位置
    
    while left <= right:  # 當(dāng)左指針不大于右指針時(shí),繼續(xù)搜索
        mid = (left + right) // 2  # 計(jì)算中間位置
        
        if arr[mid] == target:  # 如果中間元素等于目標(biāo)元素,搜索成功
            return mid  # 返回中間元素的索引
        elif arr[mid] < target:  # 如果中間元素小于目標(biāo)元素,說(shuō)明目標(biāo)在右半部分
            left = mid + 1  # 移動(dòng)左指針到中間元素的右側(cè)一位
        else:  # 否則,目標(biāo)在左半部分
            right = mid - 1  # 移動(dòng)右指針到中間元素的左側(cè)一位
    
    return -1  # 如果搜索范圍為空仍未找到目標(biāo)元素,返回 -1 表示未找到

# 示例用法
sorted_list = [1, 2, 3, 4, 7, 9]
target_element = 7
result = binary_search(sorted_list, target_element)
if result != -1:
    print(f"元素 {target_element} 在索引 {result} 處找到。")
else:
    print("元素未找到。")

上述代碼演示了如何使用二分查找在有序列表 sorted_list 中查找目標(biāo)元素 7。根據(jù)工作原理,二分查找的時(shí)間復(fù)雜度為 O(log n),其中 n 是數(shù)據(jù)集合的大小,這使得它非常適合在大型有序數(shù)據(jù)集合中查找目標(biāo)元素。

?2 線性查找算法

????????線性查找(Linear Search)是一種簡(jiǎn)單的搜索算法,也稱(chēng)為順序查找。它的工作原理是逐個(gè)遍歷數(shù)據(jù)集合中的元素,直到找到匹配的元素或遍歷整個(gè)集合。

原理:

  1. 從數(shù)據(jù)集合的第一個(gè)元素開(kāi)始,逐個(gè)檢查每個(gè)元素,直到找到匹配的元素或遍歷整個(gè)集合。

  2. 如果找到與目標(biāo)元素匹配的元素,返回該元素的索引(位置)。

  3. 如果遍歷整個(gè)集合都沒(méi)有找到匹配的元素,返回特定的“未找到”值(通常是 -1)。

以下是線性查找的原理示例:

數(shù)據(jù)集合: [2, 4, 7, 1, 9, 3]
要查找的元素: 7

初始狀態(tài):
  ↓
[2, 4, 7, 1, 9, 3]
 ^
 
第一次比較:元素 2 與目標(biāo) 7 不匹配,繼續(xù)下一個(gè)元素。
  ↓
[2, 4, 7, 1, 9, 3]
    ^

第二次比較:元素 4 與目標(biāo) 7 不匹配,繼續(xù)下一個(gè)元素。
  ↓
[2, 4, 7, 1, 9, 3]
       ^

第三次比較:元素 7 與目標(biāo) 7 匹配,找到了目標(biāo)元素。
  ↓
[2, 4, 7, 1, 9, 3]
          ^
          
目標(biāo)元素 7 找到在索引 2 處。

????????上述示意圖演示了如何使用線性查找在給定的數(shù)據(jù)集合中查找目標(biāo)元素 7。算法從數(shù)據(jù)集合的第一個(gè)元素開(kāi)始逐個(gè)比較,直到找到匹配的元素或遍歷整個(gè)集合。

????????這個(gè)示意圖反映了線性查找的工作原理,即逐個(gè)遍歷數(shù)據(jù)元素以尋找匹配項(xiàng)。如果目標(biāo)元素存在于數(shù)據(jù)集合中,線性查找將找到該元素的索引。如果目標(biāo)元素不存在,則遍歷整個(gè)數(shù)據(jù)集合后返回特定的未找到值(通常是 -1)。

以下是一個(gè)Python線性查找示例代碼:

def linear_search(arr, target):
    """
    線性查找函數(shù)

    Parameters:
    - arr: 待查找的列表
    - target: 要查找的目標(biāo)元素

    Returns:
    - 如果找到目標(biāo)元素,返回其索引;否則返回 -1。
    """
    for i in range(len(arr)):  # 遍歷列表中的每個(gè)元素
        if arr[i] == target:  # 如果當(dāng)前元素與目標(biāo)元素匹配
            return i  # 返回匹配元素的索引
    return -1  # 如果遍歷完整個(gè)列表未找到匹配元素,返回 -1 表示未找到

# 示例用法
my_list = [2, 4, 7, 1, 9, 3]
target_element = 7

result = linear_search(my_list, target_element)  # 調(diào)用線性查找函數(shù)

if result != -1:
    print(f"元素 {target_element} 在索引 {result} 處找到。")
else:
    print("元素未找到。")

????????在上述代碼中,linear_search 函數(shù)用于執(zhí)行線性查找。它接受兩個(gè)參數(shù):要查找的列表 arr 和目標(biāo)元素 target。函數(shù)逐個(gè)遍歷列表中的元素,如果找到匹配的元素,則返回匹配元素的索引;如果遍歷完整個(gè)列表都沒(méi)有找到匹配元素,則返回 -1 表示未找到。

????????示例用法演示了如何調(diào)用 linear_search 函數(shù)來(lái)查找目標(biāo)元素 7 在列表 my_list 中的位置。如果找到目標(biāo)元素,程序?qū)⒋蛴〕稣业降乃饕?,否則打印 "元素未找到。"。

3 哈希查找算法

????????哈希查找(Hash Search)是一種高效的搜索算法,它利用哈希函數(shù)將鍵映射到存儲(chǔ)位置,并在該位置查找目標(biāo)元素。哈希查找適用于快速查找和檢索,特別適用于大型數(shù)據(jù)集合。以下是哈希查找的詳細(xì)解釋和示例:

工作原理:

  1. 哈希表:哈希查找的核心是哈希表,它是一個(gè)數(shù)據(jù)結(jié)構(gòu),由鍵-值對(duì)組成。哈希表內(nèi)部使用哈希函數(shù)將鍵轉(zhuǎn)換為存儲(chǔ)位置(索引),然后將鍵和值存儲(chǔ)在該位置。

  2. 哈希函數(shù):哈希函數(shù)接受一個(gè)鍵作為輸入,并生成一個(gè)索引(位置),通常是一個(gè)整數(shù)。好的哈希函數(shù)應(yīng)該具有以下特性:

    • 對(duì)于相同的輸入鍵,始終生成相同的索引。
    • 將不同的輸入鍵均勻地映射到不同的索引,以減少?zèng)_突。
    • 生成的索引應(yīng)盡可能分散,以降低沖突的可能性。
  3. 查找過(guò)程:要查找目標(biāo)元素,哈希函數(shù)首先計(jì)算目標(biāo)元素的哈希值(索引),然后在哈希表的該位置查找對(duì)應(yīng)的值。如果找到匹配的值,查找成功;否則,表示未找到目標(biāo)元素。

示例代碼:

以下是一個(gè)使用Python的哈希查找示例代碼,我們將使用字典作為哈希表來(lái)演示:

# 創(chuàng)建一個(gè)哈希表(字典)
my_dict = {'apple': 3, 'banana': 2, 'cherry': 5, 'date': 1, 'grape': 4}

# 要查找的目標(biāo)鍵
target_key = 'banana'

# 使用哈希查找
if target_key in my_dict:
    value = my_dict[target_key]
    print(f"The value of {target_key} is {value}")
else:
    print(f"{target_key} not found")

????????在上述示例中,我們首先創(chuàng)建了一個(gè)哈希表 my_dict,其中包含鍵-值對(duì)。然后,我們定義了要查找的目標(biāo)鍵 target_key'banana'。通過(guò)使用哈希查找,我們可以直接訪問(wèn)哈希表中的值,而不需要逐個(gè)遍歷整個(gè)集合。如果目標(biāo)鍵存在于哈希表中,我們將獲得與該鍵關(guān)聯(lián)的值。

????????請(qǐng)注意,哈希查找的效率非常高,因?yàn)樗ǔ>哂谐A繒r(shí)間復(fù)雜度 O(1)。然而,哈希函數(shù)的設(shè)計(jì)和解決沖突的方法對(duì)算法的性能至關(guān)重要。合適的哈希函數(shù)和處理沖突的方法可以確保高效的哈希查找。

4 應(yīng)用

  1. 線性查找(Linear Search):

    • 工作原理:逐個(gè)遍歷數(shù)據(jù)集合,查找目標(biāo)元素。
    • 應(yīng)用:適用于小型無(wú)序數(shù)據(jù)集合,或當(dāng)數(shù)據(jù)無(wú)序且不頻繁查找時(shí)。常見(jiàn)于簡(jiǎn)單的列表或數(shù)組。
  2. 二分查找(Binary Search):

    • 工作原理:適用于有序數(shù)據(jù)集合,將數(shù)據(jù)集合分成兩半,逐步縮小搜索范圍。
    • 應(yīng)用:適用于大型有序數(shù)據(jù)集合,如數(shù)組或有序列表。常見(jiàn)于數(shù)據(jù)庫(kù)索引等高效查找場(chǎng)景。
  3. 哈希查找(Hash Search):

    • 工作原理:通過(guò)哈希函數(shù)將鍵映射到存儲(chǔ)位置,查找時(shí)直接訪問(wèn)該位置。
    • 應(yīng)用:適用于快速查找,如字典、散列表(哈希表)等數(shù)據(jù)結(jié)構(gòu)。常用于處理大量數(shù)據(jù)的快速索引。
  4. 二叉搜索樹(shù)查找(Binary Search Tree Search):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-714056.html

    • 工作原理:通過(guò)二叉搜索樹(shù)的有序性,在左子樹(shù)或右子樹(shù)中查找目標(biāo)元素。
    • 應(yīng)用:適用于維護(hù)有序數(shù)據(jù)集合,如數(shù)據(jù)庫(kù)索引、字典實(shí)現(xiàn)等

到了這里,關(guān)于【Python查找算法】二分查找、線性查找、哈希查找的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【算法】【Python3、動(dòng)態(tài)規(guī)劃、貪心、二分查找】力扣1671. 得到山形數(shù)組的最少刪除次數(shù)

    1671. 得到山形數(shù)組的最少刪除次數(shù) 給定一個(gè)整數(shù)數(shù)組 nums ,我們定義該數(shù)組為山形數(shù)組當(dāng)且僅當(dāng): nums 的長(zhǎng)度至少為 3。 存在一個(gè)下標(biāo) i 滿(mǎn)足 0 i len(nums) - 1 且: nums[0] nums[1] ... nums[i - 1] nums[i] nums[i] nums[i + 1] ... nums[len(nums) - 1] 現(xiàn)在,給定整數(shù)數(shù)組 nums ,我們的目標(biāo)是將其變?yōu)?/p>

    2024年01月18日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)和算法——哈希查找沖突處理方法(開(kāi)放地址法-線性探測(cè)、平方探測(cè)、雙散列探測(cè)、再散列,分離鏈接法)

    數(shù)據(jù)結(jié)構(gòu)和算法——哈希查找沖突處理方法(開(kāi)放地址法-線性探測(cè)、平方探測(cè)、雙散列探測(cè)、再散列,分離鏈接法)

    目錄 開(kāi)放地址法(Open Addressing) 線性探測(cè)(Linear Probing) 散列表查找性能分析 平方探測(cè)(Quadratic Probing)? 定理 平方探測(cè)法的查找與插入 雙散列探測(cè)法(Double Hashing)? 再散列(Rehashing) 分離鏈接法(Separate Chaining) 平均查找次數(shù) 分離鏈接法的散列表實(shí)現(xiàn) 常用處理沖突的

    2024年02月08日
    瀏覽(23)
  • 折半查找(二分查找)的兩種方法及實(shí)現(xiàn) Python

    概念: 在計(jì)算機(jī)科學(xué)中,折半查找,也稱(chēng)二分查找,是一種在有序數(shù)組中查找某一特定元素的搜索算法。 搜索過(guò)程從數(shù)組的中間元素開(kāi)始,如果中間元素正好是要查找的元素,則搜索過(guò)程結(jié)束;如果某一特定元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素的那一

    2024年02月09日
    瀏覽(26)
  • 代碼隨想錄Python:704. 二分查找,27. 移除元素

    數(shù)組是非?;A(chǔ)的數(shù)據(jù)結(jié)構(gòu)。 數(shù)組是存放在連續(xù)內(nèi)存空間上的相同類(lèi)型數(shù)據(jù)的集合。 題目: 給定一個(gè)? n ?個(gè)元素有序的(升序)整型數(shù)組? nums ?和一個(gè)目標(biāo)值? target ??,寫(xiě)一個(gè)函數(shù)搜索? nums ?中的? target ,如果目標(biāo)值存在返回下標(biāo),否則返回? -1 。 題目鏈接:. - 力扣

    2024年02月13日
    瀏覽(20)
  • chatgpt使用python寫(xiě)一段二分查找的demo

    以下是一個(gè)Python實(shí)現(xiàn)的簡(jiǎn)單二分查找算法的代碼示例: 這個(gè)代碼示例實(shí)現(xiàn)了一個(gè)二分查找算法,用于在已排序的列表中查找目標(biāo)值。它通過(guò)不斷將搜索范圍縮小為左半部分或右半部分來(lái)快速定位目標(biāo)值,從而提高了查找效率。如果找到目標(biāo)值,它會(huì)返回目標(biāo)值的索引,否則返

    2024年02月09日
    瀏覽(22)
  • 【算法系列篇】二分查找——這還是你所知道的二分查找算法嗎?

    【算法系列篇】二分查找——這還是你所知道的二分查找算法嗎?

    在生活中,我們往往會(huì)遇到在數(shù)組中查找某個(gè)確定的元素的時(shí)候,通常我們會(huì)選擇使用暴力解法,這樣雖然簡(jiǎn)單,但是時(shí)間復(fù)雜度是O(N),時(shí)間效率比較低。那么是否有方法可以使得在具有二段性的數(shù)組中找某一特定的元素的時(shí)間復(fù)雜度低于0(N)呢?答案是肯定的,當(dāng)我們可以

    2024年02月11日
    瀏覽(21)
  • 【算法系列 | 8】深入解析查找算法之—二分查找

    【算法系列 | 8】深入解析查找算法之—二分查找

    心若有陽(yáng)光,你便會(huì)看見(jiàn)這個(gè)世界有那么多美好值得期待和向往。 決定開(kāi)一個(gè)算法專(zhuān)欄,希望能幫助大家很好的了解算法。主要深入解析每個(gè)算法,從概念到示例。 我們一起努力,成為更好的自己! 今天第8講,講一下查找算法的二分查找 查找算法是很常見(jiàn)的一類(lèi)問(wèn)題,主

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

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

    2024年02月08日
    瀏覽(18)
  • 【算法】二分查找(整數(shù)二分和浮點(diǎn)數(shù)二分)

    【算法】二分查找(整數(shù)二分和浮點(diǎn)數(shù)二分)

    大家好!今天我們來(lái)學(xué)習(xí)二分查找算法,這是一種效率很高的算法哦! 目錄 1. 整數(shù)二分 2. 整數(shù)二分模板 3. 整數(shù)二分模板題 3.1 洛谷 P2249 【深基13.例1】查找 3.2?Acwing789. 數(shù)的范圍 4. 浮點(diǎn)數(shù)二分 5. 浮點(diǎn)數(shù)二分模板 6. 浮點(diǎn)數(shù)二分模板題 6.1 Acwing 790.數(shù)的三次方根 6.2 洛谷 P1024 [

    2024年02月10日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包