每日算法-二分查找

適用場景

適用于有序數組中查找某一個值.
每查找一次,就將搜尋范圍縮小一半,
平均時間復雜度是O(log_{2}N), 簡記作:O(lgN).

主要難點

主要難點在于邊界條件的判斷;

大致思路:

1.當供查找的數組不合法時,直接返回結果,查詢無果;

2.當數組長度等于1時,直接判斷是否相等即可;

3.當數組僅有兩個元素時,直接分別判斷;

4.當數組元素多于2個時, 采用如下策略:

1) 有限比較數組頭尾兩個元素與查詢目標元素的值比較, 因為是有序數組,如果在界外,則直接判斷給出查詢結果;

2)如果和邊界元素比較后,范圍在界內,則開始真正的二分查找法,分別采用low, high, mid三個游標來界定查詢范圍.

實現方式

1.迭代法

2.遞歸法

3.Arrays.binarySearch(int[] arr, int target) API

實踐代碼如下:


import java.util.Arrays;/*** 默認有序數組arr[]是從小到大的順序排列的,如果不是則需要先結合排序算法使用.*/
public class BinarySearch {// 迭代法public int binarySearch1(int[] arr, int target) {// 先判斷數據的有效性if (arr == null || arr.length < 1) {return -1;}int low = 0;final int length = arr.length;int high = length - 1;int mid;// System.out.println("length:" + length + ",low:" + low + ",high:" + high//         + ",mid:" + (low + high) / 2);// 先判斷頭尾游標的值if (length == 1) {if (arr[0] == target) {return 0;} else {return -1;// not found}} else { // length >= 2if (arr[low] == target) {return low;} else if (arr[high] == target) {return high;} else if (arr[low] > target || arr[high] < target) {//如果待查找的數值在有序數組最大或者最小值之外,直接判查詢未果,無須再二分查找了.return -1;}}while (low < high) {mid = (low + high) / 2;// System.out.println("low:" + low//         + ",value[low]:" + arr[low]//         + ",high:" + high + ",value[high]:" + arr[high]//         + ",mid:" + mid + ",value[mid]:" + arr[mid]);//這段非常重要,否則將可能出現死循環,//當頭游標和尾游標的中間值已經是起始或者末尾兩個游標位之一時,代表查找結束,且無果.if (high == mid || low == mid) {return -1;}if (arr[mid] < target) {low = mid;} else if (arr[mid] > target) {high = mid;} else if (arr[mid] == target) {return mid;}}return -1;}// 遞歸法public int binarySearch2(int[] arr, int target) {// System.out.println("enter binarySearch2");if (null == arr || arr.length < 1) {return -1;}final int length = arr.length;if (length == 1) {if (arr[0] == target) {return 0;} else {return -1;// not found}} else { // length >= 2if (arr[0] == target) {return 0;} else if (arr[arr.length - 1] == target) {return arr.length - 1;} else if (arr[0] > target || arr[length - 1] < target) {return -1;// not found}}return binarySearchRecursion(arr, 0, arr.length - 1, target);}private int binarySearchRecursion(int arr[], int low, int high, int target) {// System.out.println("length:" + arr.length + ",low:" + low + ",high:" + high//         + ",mid:" + (low + high) / 2);int mid;while (low < high) {mid = (low + high) / 2;//這段非常重要,否則將可能出現死循環,//當頭游標和尾游標的中間值已經是起始或者末尾兩個游標位之一時,代表查找結束,且無果.if (mid == low || mid == high) {return -1;}if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {return binarySearchRecursion(arr, mid, high, target);} else if (arr[mid] > target) {return binarySearchRecursion(arr, low, mid, target);}}return -1;}// Arrays.binarySearch API法public int binarySearchArrays(int[] arr, int target) {if (arr == null || arr.length <= 0) {return -1;}//Arrays.sort(arr);return Arrays.binarySearch(arr, target);}public static void main(String[] args) {// 多個測試用例數組int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,};int[] arr2 = {1, 2, 4,};int[] arr3 = {1, 2, 4, 6};int[] arr4 = {1, 2, 4, 6, 8};int[] bigArr = new int[10000];for (int i = 0; i < 10000; i++) {bigArr[i] = i * 2;}System.out.println("init arr done!");int wanted = 6;int[] toBeSearchArr = bigArr;BinarySearch bs = new BinarySearch();System.out.println("binearySearch1 :" + bs.binarySearch1(toBeSearchArr, wanted));System.out.println("binearySearch2 recursion :" + bs.binarySearch2(toBeSearchArr, wanted));System.out.println("Arrays.binarySearch():" + bs.binarySearchArrays(toBeSearchArr, wanted));}
}

測試結果如下:

init arr done!
binearySearch1 :3
binearySearch2 recursion :3
Arrays.binarySearch():3[Done] exited with code=0 in 1.508 seconds

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

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

相關文章

AI生成音樂——創作的革命與未來的思考

AI在創造還是毀掉音樂&#xff1f; 最近一個月&#xff0c;音樂大模型的輪番上線&#xff0c;迅速降低了素人生產音樂的門檻&#xff0c;并引發了關于音樂圈是否會被AI徹底顛覆的熱議。短暫的興奮過后&#xff0c;更多理性的目光開始審視AI產品的版權歸屬、創意產業在AI陰影下…

Redis 7.x 系列【6】數據類型之字符串(String)

有道無術&#xff0c;術尚可求&#xff0c;有術無道&#xff0c;止于術。 本系列Redis 版本 7.2.5 源碼地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目錄 1. 前言2. 常用命令2.1 SET2.2 GET2.3 MSET2.4 MGET2.5 GETSET2.6 STRLEN2.7 SETEX2.8…

全方位對比PostgreSQL和MySQL

目錄 引言 技術架構與設計哲學 起源與發展 數據庫引擎 PostgreSQL與MySQL&#xff1a;SQL語法與特性對比概覽 PostgreSQL與MySQL高級特性對比&#xff1a;數據類型與事務處理能力 數據類型與功能特性 PostgreSQL與MySQL性能與可擴展性對比 PostgreSQL與MySQL性能與可擴…

南昌高校大學智能制造實驗室數字孿生可視化系統平臺建設項目驗收

南昌高校大學智能制造實驗室&#xff0c;作為該地區乃至全國智能制造領域的重要研究和教學基地&#xff0c;一直致力于探索和創新智能制造技術。近日&#xff0c;該實驗室的數字孿生可視化系統平臺建設項目成功通過了驗收&#xff0c;標志著其在數字孿生技術領域取得了重大突破…

Trick :帶 pop 的 STL 結構化綁定時不要用 auto

題目描述 給一個 n m n\times m nm 矩陣迷宮&#xff0c; 第 i i i 行第 j j j 列的值為 c i , j c_{i,j} ci,j? &#xff0c; L H LH LH 在迷宮中迷路了&#xff0c;他需要你的幫助。 L H LH LH 當前在 ( 1 , 1 ) (1,1) (1,1) 的位置&#xff0c;出口在 ( n , m ) (n…

安卓應用內通信的核心-Handler

Handler Handler是安卓應用內通信的核心。 Handler相關的類簡介 Handler機制整體可以看作一個傳送帶。 Looper 傳送帶的輪子。Handler 傳送帶上貨物的入口和出口。Message 傳送帶上的貨物。MessageQueue 傳送帶的皮帶。 基礎知識 一個Thread只有一個Looper&#xff0c;一…

滑動窗口2

1. 水果成籃&#xff08;904&#xff09; 題目描述&#xff1a; 算法原理&#xff1a; 根據題目意思&#xff0c;friuts表示第i棵樹上的水果種類&#xff0c;然后我們有兩個籃子去在這些樹上去采水果&#xff0c;但是有限制就是一個籃子里就只能裝一種水果&#xff0c;也就是…

矩陣運算在數據分析中的應用

矩陣運算在數據分析中的應用 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 矩陣運算作為數學和計算機科學中的重要概念&#xff0c;在數據分析和科學計算中發…

elasticsearch源碼分析-03選舉集群狀態

選舉集群狀態 es中存儲的數據有一下幾種&#xff0c;state元數據、lucene索引文件、translog事務日志 元數據信息可以分為&#xff1a; 集群層面的元信息-對應著metaData數據結構&#xff0c;主要是clusterUUid、settings、templates等索引層面的元信息-對應著indexMetaData數…

RK35x8通過TFTP下載內核到開發板

對于有網線接口的RK35X8開發板&#xff0c;調試時候&#xff0c;可以通過網線下載內核鏡像和設備樹到開發板&#xff0c;不用每次修改驅動都要重新打開下載工具&#xff0c;進入下載模式。通過TFTP可以大大提高調試效率。 在ubuntu安裝TFTP服務 安裝tftp服務器 sudo apt-get…

【面試系列】前端開發工程師高頻面試題及詳細解答

歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;歡迎訂閱相關專欄&#xff1a; ?? 全網最全IT互聯網公司面試寶典&#xff1a;收集整理全網各大IT互聯網公司技術、項目、HR面試真題. ?? AIGC時代的創新與未來&#xff1a;詳細講解AIGC的概念、核心技術、…

Python商務數據分析知識專欄(二)——Python數據分析基礎

Python商務數據分析知識專欄&#xff08;二&#xff09;——Python數據分析基礎 一、Python數據分析概述二、Numpy數值計算基礎專欄二&#xff08;Python數據分析基礎&#xff09;的總結 與 專欄三&#xff08;Python數據分析的應用&#xff09;開端 一、Python數據分析概述 二…

【筆記】Spring Cloud Gateway 實現 gRPC 代理

Spring Cloud Gateway 在 3.1.x 版本中增加了針對 gRPC 的網關代理功能支持,本片文章描述一下如何實現相關支持.本文主要基于 Spring Cloud Gateway 的 官方文檔 進行一個實踐練習。有興趣的可以翻看官方文檔。 由于 Grpc 是基于 HTTP2 協議進行傳輸的&#xff0c;因此 Srping …

深度學習之Transformer模型的Vision Transformer(ViT)和Swin Transformer

Transformer 模型最初由 Vaswani 等人在 2017 年提出,是一種基于自注意力機制的深度學習模型。它在自然語言處理(NLP)領域取得了巨大成功,并且也逐漸被應用到計算機視覺任務中。以下是兩種在計算機視覺領域中非常重要的 Transformer 模型:Vision Transformer(ViT)和 Swi…

git 個人常見錯誤備注

問題1&#xff1a;all conflict fixed but you are still merging。。。。。 如果你已經解決了所有沖突&#xff0c;但 Git 仍然提示你正在進行合并&#xff0c;可能是因為你還沒有完成合并過程。以下是詳細步驟&#xff0c;確保你正確完成合并并提交更改&#xff1a; 確認所…

Tongsuo(銅鎖)項目介紹 - 實現國密SSL協議

文章介紹 銅鎖(Tongsuo)是一個提供現代密碼學算法和安全通信協議的開源基礎密碼庫,為存儲、網絡、密鑰管理、隱私計算、區塊鏈等諸多業務場景提供底層的密碼學基礎能力,實現數據在傳輸、使用、存儲等過程中的私密性、完整性和可認證性,為數據生命周期中的隱私和安全提供保…

鴻蒙 如何 url decode

在 TypeScript 和 JavaScript 中進行 URL 編碼的最簡單方式是使用內置的 global 函數 encodeURIComponent()。以下是一個示例&#xff1a; let url "https://example.com/?name測試&job開發者"; let encodedURL encodeURIComponent(url); console.log(encode…

【RAG】FoRAG:面向網絡增強型長形式問答的事實性優化RAG

一、解決問題 在基于網絡的長形式問答&#xff08;Web-enhanced Long-form Question Answering, LFQA&#xff09;任務中&#xff0c;現有RAG在生成答案時存在的問題&#xff1a; 事實性不足&#xff1a;研究表明&#xff0c;現有系統生成的答案中只有大約一半的陳述能夠完全得…

Qt開發筆記:Qt3D三維開發筆記(一):Qt3D三維開發基礎概念介紹

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/140059315 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、O…

匯編語言基礎教程

匯編語言基礎教程 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將深入探討匯編語言的基礎知識和應用&#xff0c;幫助大家理解匯編語言在計算機編程中…