網站首頁 編程語言 正文
前言:
二分法也就是二分查找,它是一種效率較高的查找方法
假如公司新來了一個人,叫張三,他是你們公司第47個人,過了一段時間后,有些人呢看張三不爽,離職了,那這時候張三肯定不是公司第47個人了,怎么樣才知道張三排第幾呢,下面我們用二分法把他找出來
思路:
給你一本1000頁的書籍,隨機給定一個頁碼,如何用最快的方式找到它?如果一頁一頁逐步去查找,則最高需要查找一千次!那我們如何用二分法來解決這個問題呢?二分法的關鍵就是二分這個詞。
?
?步驟1:設定一個頁碼作為中心點來將1000頁分為兩份,中位數的作用就是每次縮小一半查找范圍,即達到開方的效果。即可以用 (首位+末位)/2 = 中位數。
?步驟2:將需要查找的頁碼與中位數比價,如果大于中位數則舍棄對中位數的前一半查找,反之則舍棄對后一半范圍查找,達成開方效果。 步驟3:在新的查找范圍重新計算出中位數?
步驟4:查找頁碼對比中位數,確定新的查找范圍
步驟5:循環以上步驟,直到找到該頁碼為止
代碼:
通過以上思路解析,我們知道了二分法實行步驟,接下來就通過代碼來實現步驟,首先是循環實現
#模擬頁碼 array = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29, 33, 38, 69,99,107] #首位值 low = 0 #末位值 height = len(array)-1 #設定查找頁碼 findNum = 1 ? #循環查找 while True: ? ? #獲取中位數 ? ? mid = int((low+height)/2) ? ? #打印中位數,查看循環次數 ? ? print(array[mid]) ? ? #如果中位數小于查找值,則鎖定后半段 ? ? if array[mid] < findNum: ? ? ? ? #重置低位數 ? ? ? ? low = mid + 1 ? ? #如果中位數大于查找值,則鎖定前半段 ? ? elif array[mid] > findNum: ? ? ? ? #重置高位值 ? ? ? ? height = mid - 1 ? ? #找到數字則打印該值下標,終止循環 ? ? elif array[mid]==findNum: ? ? ? ? print('find it:',array[mid],' index:',mid) ? ? ? ? break
除了上述方式外,也可以使用遞歸來實現,代碼更加簡潔
array = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29, 33, 38, 69,99,107] ? #函數遞歸 #定義一個函數,給三個形參:低位值,高位值,查找值 def BinarySearch(low,height,findNum): ? ? #計算出中位數 ? ? middle = (low+height)//2 ? ? #如果中位數小于查找值,則鎖定后半段 ? ? if findNum >array[middle]: ? ? ? ? #重置低位數 ? ? ? ? low = middle +1 ? ? #如果中位數大于查找值,則鎖定前半段 ? ? elif findNum
總結:
根據結果反饋,使用二分法常規Python檢索用循環方式找數字21,他是排在11位,中位數查詢3次,使用Python二分法檢索遞歸方式先取查詢數字的倍數,然后鎖定前半段進行索引,索引的步驟耗時更少
原文鏈接:https://blog.csdn.net/AI19970205/article/details/123464424
相關推薦
- 2022-07-31 python虛擬機解釋器及運行過程_python
- 2023-01-07 Flutter?Dart快速排序算法示例詳解_Dart
- 2023-04-27 React中關于render()的用法及說明_React
- 2022-04-03 Android實現recyclerview城市字母索引列表_Android
- 2022-08-19 Python截取字符串的簡單方法實例_python
- 2022-12-05 TensorFlow中關于tf.app.flags命令行參數解析模塊_python
- 2022-10-03 react實現數據監聽方式_React
- 2023-02-05 Flutter實現固定header底部滑動頁效果示例_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支