二分查找(遞歸和迭代)– Python

1. 使用遞歸進行二分查找的 Python 程序

創建一個遞歸函數,并將搜索空間的 mid 與 key 進行比較。根據結果,要么返回找到鍵的索引,要么調用下一個搜索空間的遞歸函數。

# 用于遞歸二進制搜索的 Python 3 程序。
# 在注釋中可以找到對舊版 Python 2 所需的修改。# 如果存在,則返回 arr 中 x 的索引,否則返回 -1
def binary_search(arr, low, high, x):# Check base caseif high >= low:mid = (high + low) // 2# 如果元素本身存在于中間if arr[mid] == x:return mid# 如果元素小于中間值,則它只能出現在左子數組中elif arr[mid] > x:return binary_search(arr, low, mid - 1, x)# 否則該元素只能出現在右子數組中else:return binary_search(arr, mid + 1, high, x)else:# 元素不在數組中return -1# Test array
arr = [ 2, 3, 4, 10, 40 ]
x = 10# Function call
result = binary_search(arr, 0, len(arr)-1, x)if result != -1:print("元素存在于索引", str(result))
else:print("數組中不存在元素")


輸出

元素位于索引 3

時間復雜度:O(log n)

輔助空格:O(logn) [注意:遞歸創建調用堆棧]

2. 使用迭代進行二分查找的 Python 程序

這里我們使用 while 循環來繼續比較鍵并將搜索空間分成兩半的過程。

# 迭代二分搜索函數
# 如果存在,則返回給定數組 arr 中 x 的索引,
# 否則返回 -1
def binary_search(arr, x):low = 0high = len(arr) - 1mid = 0while low <= high:mid = (high + low) // 2# 如果 x 更大,則忽略左半部分if arr[mid] < x:low = mid + 1# 如果 x 較小,則忽略右半部分elif arr[mid] > x:high = mid - 1# 表示 x 出現在中間else:return mid# 如果我們到達這里,則該元素不存在return -1# 測試數組
arr = [ 2, 3, 4, 10, 40 ]
x = 10# 函數調用
result = binary_search(arr, x)if result != -1:print("元素存在于索引", str(result))
else:print("數組中不存在元素")


輸出

元素位于索引 3

時間復雜度:O(log n)

輔助空間:O(1)

3. 使用內置的 bisect 模塊進行二分查找的 Python 程序

分步方法:

  • 代碼導入 bisect 模塊,該模塊提供對二分查找的支持。
  • 定義binary_search_bisect() 函數的定義是將數組 arr 和要搜索的元素 x 作為輸入。
  • 該函數調用 bisect 模塊的 bisect_left() 函數,該函數查找元素在排序數組 arr 中的位置,其中應插入 x 以保持排序順序。如果元素已存在于數組中,則此函數將返回其位置。
  • 然后,該函數檢查返回的索引 i 是否在數組范圍內,以及該索引處的元素是否等于 x。
  • 如果條件為 true,則函數返回索引 i 作為元素在數組中的位置。
  • 如果條件為 false,則函數返回 -1,指示數組中不存在該元素。
  • 然后,該代碼定義一個數組 arr 和一個要搜索的元素 x。
  • 調用 binary_search_bisect() 函數時,將 arr 和 x 作為輸入,返回的結果存儲在 result 變量中。
  • 然后,代碼檢查結果是否不等于 -1,這表示該元素存在于數組中。如果為 true,則打印元素在數組中的位置。
  • 如果結果等于 -1,則代碼將打印一條消息,指出該元素不存在于數組中。
import bisectdef binary_search_bisect(arr, x):i = bisect.bisect_left(arr, x)if i != len(arr) and arr[i] == x:return ielse:return -1# Test array
arr = [2, 3, 4, 10, 40]
x = 10# 測試數組
result = binary_search_bisect(arr, x)if result != -1:print("元素存在于索引", str(result))
else:print("數組中不存在元素")


輸出

元素位于索引 3

時間復雜度:O(log n)

輔助空間:O(1)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897361.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電力場景絕緣子缺陷分割數據集labelme格式1585張4類別

數據集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;僅僅包含jpg圖片和對應的json文件) 圖片數量(jpg文件個數)&#xff1a;1585 標注數量(json文件個數)&#xff1a;1585 標注類別數&#xff1a;4 標注類別名稱:["broken part","broken insulat…

部署說明書

一、打開IIS功能 1、 雙擊“此電腦” 2、 在空白地方右鍵后&#xff0c;點擊屬性 3、 點擊控制面板主頁 4、 查看方式選擇小圖標&#xff0c;然后點擊”程序和功能” 5、點擊”啟用或關閉Windows功能” 6、 勾選”Internet Information Services”勾選“IIS管理服務…

在vue2項目中el-table表格的表頭和內容錯位問題

一、問題描述以及產生原因 問題描述&#xff1a;當el-table表格有橫向滾動條和縱向滾動條&#xff0c;把橫向滾動條拉到最右邊&#xff0c;表格的表頭會和內容錯位&#xff08;表頭和內容列不對齊&#xff09;問題產生原因&#xff1a;在el-table有縱向滾動條時&#xff0c;el…

《基于深度學習的圖像修復技術研究與應用-圖像修復》—3000字論文模板

摘要(500字) (擴展方向:補充具體技術指標與創新點量化描述) 本文針對圖像修復技術展開研究,重點探討了基于深度學習的方法在圖像修復領域的應用。研究首先回顧了傳統圖像修復技術,隨后深入分析了深度學習在圖像修復中的優勢。本文提出了一種改進的深度學習圖像修復模型…

基于Python+Vue的智能服裝商城管理系統的設計與實現

&#x1f457; 基于PythonVue的智能服裝商城管理系統的設計與實現 電商級解決方案&#xff1a;全棧技術融合 智能推薦系統 多維度數據分析 項目亮點&#xff1a;課程設計優選 | 企業級架構規范 | 完整電商功能閉環 | 畢業設計選擇 &#x1f310; 在線資源速覽 類別地址訪問方…

【二】JavaScript能力提升---this對象

目錄 this的理解 this的原理 事件綁定中的this 行內綁定 動態綁定 window定時器中的this 相信小伙伴們看完這篇文章&#xff0c;對于this的對象可以有一個很大的提升&#xff01; this的理解 對于this指針&#xff0c;可以先記住以下兩點&#xff1a; this永遠指向一個…

使用vue3.0+electron搭建桌面應用并打包exe

使用vue3.0electron搭建桌面應用并打包exe_如何使用electron將vue3vite開發完的項目打包成exe應用程序-CSDN博客

linux如何判斷進程對磁盤是隨機寫入還是順序寫入?

模擬工具&性能測試工具&#xff1a;fio fio參數說明&#xff1a; filename/dev/sdb1&#xff1a;測試文件名稱&#xff0c;通常選擇需要測試的盤的data目錄。 direct1&#xff1a;是否使用directIO&#xff0c;測試過程繞過OS自帶的buffer&#xff0c;使測試磁盤的結果更真…

STM32基礎教程——對射式紅外傳感器計數實驗

前言 對射式紅外傳感器介紹 對射式紅外傳感器是一種非接觸式的距離檢測器&#xff0c;主要由發射器和接收器兩部分組成。發射器發出特定波長的紅外光束&#xff0c;當物體阻擋了這條光束時&#xff0c;接收器無法接收到光線信號&#xff0c;從而產生一個開關信號來判斷物體的存…

Hive-優化(語法優化篇)

列裁剪與分區裁剪 在生產環境中&#xff0c;會面臨列很多或者數據量很大時&#xff0c;如果使用select * 或者不指定分區進行全列或者全表掃描時效率很低。Hive在讀取數據時&#xff0c;可以只讀取查詢中所需要的列&#xff0c;忽視其他的列&#xff0c;這樣做可以節省讀取開銷…

rkipc控制ircut的分析

rk_isp_set_night_to_day函數 rkipc控制ircut主要通過rk_isp_set_night_to_day函數&#xff0c;例如在ser_rk_isp_set_night_to_day函數中 int ser_rk_isp_set_night_to_day(int fd) {int ret 0;int id, len;char *value NULL;if (sock_read(fd, &id, sizeof(id)) SOC…

Android Retrofit + RxJava + OkHttp 網絡請求高效封裝方案

Retrofit RxJava OkHttp 是 Android 開發中常用的網絡請求庫組合。Retrofit 是一個類型安全的 HTTP 客戶端&#xff0c;RxJava 是一個響應式編程庫&#xff0c;OkHttp 是一個高效的 HTTP 客戶端。 Retrofit RxJava OkHttp 的組合可以提供以下功能&#xff1a; 職責清晰 R…

【nRF52832】【Nodic】開發入門【三】模塊化

title: nRF52832開發入門【二】模塊化 tags: nodic categories: nodic abbrlink: 37752 date: 2025-03-09 17:22:17 1. 介紹 我們實際開發過程中往往會很復雜&#xff0c;為了更好的管理代碼&#xff0c;我們需要模塊化。模塊化的好處有很多&#xff0c;比如&#xff1a; 降…

爬蟲案例八js逆向爬取網易音樂

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、js逆向的前期準備二、網站分析三、代碼 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 爬取網易音樂 提示&#xff1a;以下是本篇…

vue2實現組件庫的自動按需引入,unplugin-auto-import,unplugin-vue-components

1.使用ant-design-vue或者element-ui時&#xff0c;如何每個組件都去import導入組件&#xff0c;大大降低了開發效率&#xff0c;如果全局一次性注冊會增加項目體積&#xff0c;那么如何實現既不局部引入&#xff0c;也不全局注冊&#xff1f; 2.在element-plus官網看到有說明…

【Andrej Karpathy 神經網絡從Zero到Hero】--2.語言模型的兩種實現方式 (Bigram 和 神經網絡)

目錄 統計 Bigram 語言模型質量評價方法 神經網絡語言模型 【系列筆記】 【Andrej Karpathy 神經網絡從Zero到Hero】–1. 自動微分autograd實踐要點 本文主要參考 大神Andrej Karpathy 大模型講座 | 構建makemore 系列之一&#xff1a;講解語言建模的明確入門&#xff0c;演示…

(二 十 二)趣學設計模式 之 備忘錄模式!

目錄 一、 啥是備忘錄模式&#xff1f;二、 為什么要用備忘錄模式&#xff1f;三、 備忘錄模式的實現方式四、 備忘錄模式的優缺點五、 備忘錄模式的應用場景六、 總結 &#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&#xff0c;…

安裝SPSS后啟動顯示應用程序無法啟動,因為應用程序的并行配置不正確的解決方案

軟件安裝報錯問題有需要遠程文章末尾獲取聯系方式&#xff0c;可以幫你遠程處理各類安裝報錯。 一、安裝SPSS后啟動顯示應用程序無法啟動&#xff0c;因為應用程序的并行配置不正確報錯 在成功安裝 SPSS 軟件后&#xff0c;嘗試啟動應用程序時&#xff0c;系統彈出錯誤提示窗…

IP,MAC,ARP 筆記

1.什么是IP地址 IP 地址是一串由句點分隔的數字。IP 地址表示為一組四個數字&#xff0c;比如 192.158.1.38 就是一個例子。該組合中的每個數字都可以在 0 到 255 的范圍內。因此&#xff0c;完整的 IP 尋址范圍從 0.0.0.0 到 255.255.255.255。 IP 地址不是隨機的。它們由互…

C++11中的Condition_variable

C11中的condition_variable 在C11中&#xff0c;條件變量&#xff08;std::condition_variable&#xff09;是線程同步機制之一&#xff0c;用于在多線程環境中實現線程間的通信和協調。它允許一個或多個線程在某個條件尚未滿足時等待&#xff0c;直到其他線程通知條件已經滿足…