【數據結構】二分查找(返回插入點)5.14

二分查找基礎版

package 二分查找;
public class BinarySearch { 	
public static void main(String[] args) {		// TODO Auto-generated method stub	}     public static int
binarySearchBasic(int[] a,int target) {    	 int i=0,j=a.length-1; //設置指針初值    	 
while(i<=j) { //范圍有內容    		 
int m=(i+j)/2;    		 
if(target<a[m]) {    			 
j=m-1;    		 
}else if(target>a[m]) {    			 i=m+1;    		 
}else {    			 
return m;    		 
}    	 
}    	 
return -1;	} 
}

說明:
若目標在最左邊,判斷語句執行L次
若目標在最右邊,判斷語句執行2*L次
不平衡

平衡版
目的:為了減少執行次數

package 二分查找;
public class BinarySearch { 	
public static void main(String[] args) {		// TODO Auto-generated method stub	}     public static int
binarySearchBasic(int[] a,int target) {    	 int i=0,j=a.length; //設置指針初值    	 
while(1<j-i) { //范圍有內容  		 
int m=(i+j)>>>2;    		 
if(target<a[m]) {    			 
j=m;    		 //邊界改變  		 
}else {    			 
i=m;    		 //若i=m+1,當目標等于中間值時會錯過}    	 
}  
if(a[m]==traget)return i;elsereturn -1;} 
}

Java版

package 二分查找;
public class BinarySearch { 	
public static void main(String[] args) {		// TODO Auto-generated method stub	}     public static int
binarySearchBasic(int[] a,int target) {    	 int i=0,j=a.length-1; //設置指針初值    	 
while(i<=j) { //范圍有內容    		 
int m=(i+j)/2;    		 
if(target<a[m]) {    			 
j=m-1;    		 
}else if(target>a[m]) {    			 i=m+1;    		 
}else {    			 
return m;    		 
}    	 
}    	 
return -(i+1;	//返回值 -插入點-1
} 
}

源碼

private static int binarySearch0(int[] a, int key) {int low = 0, high = a.length - 1;    while (low <= high) {        
int mid = (low + high) >>> 1;        
if (a[mid] < key) 
low = mid + 1;        
else if (a[mid] > key) 
high = mid - 1;        
else return mid; // 找到時返回下標    
}    
return -(low + 1); // 未找到時返回插入點編碼
}

為什么這樣設計?
// 編碼過程
返回值 = -(插入點 + 1)
// 解碼過程插入點 = -返回值 - 1

  1. 保留插入點信息
    通過數學變換,你可以反向計算出插入位置:
    插入點 = -(返回值 + 1)
    例如 -2 → -( -2 + 1 ) = 1

  2. 避免歧義
    如果直接返回 -插入點,當插入點是 0 時,返回值也是 0,這會和「找到目標且下標為0」的情況沖突。

  3. 效率優化
    查找時已經計算出了插入點,直接返回可以避免二次查找。

插入元素

int[] a = {2, 5, 8};  // 已經排好序的數組
int target = 4;        // 我們要查找/插入的數字
int i = Arrays.binarySearch(a, target);
//Java中的二分查找
int insertIndex = Math.abs(i + 1);//實際插入位置
int[] b = new int[a.length + 1];  // 新數組長度比原數組大1
// 1. 復制插入點前的元素(不包含插入點)
System.arraycopy(a, 0, b, 0, insertIndex);
// 參數解釋:
// a: 源數組
// 0: 從源數組的哪個位置開始復制
// b: 目標數組
// 0: 放到目標數組的哪個位置
// insertIndex: 要復制多少個元素// 2. 插入新元素
b[insertIndex] = target;// 3. 復制插入點后的元素
System.arraycopy(a, insertIndex, b, insertIndex + 1, a.length - insertIndex);
// 參數解釋:
// a: 源數組
// insertIndex: 從源數組的哪個位置開始復制
// b: 目標數組
// insertIndex + 1: 放到目標數組的哪個位置(跳過插入的新元素)
// a.length - insertIndex: 要復制多少個元素

為什么這樣設計?
這種設計的好處:
1)保持數組始終有序
2)插入操作高效(使用 System.arraycopy 是本地方法,速度很快)
3)利用了二分查找的高效性(O(log n))

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

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

相關文章

Ubuntu 命令

Ubuntu 命令速查表? ?分類??命令??功能描述??示例/常用選項????文件與目錄?ls列出目錄內容ls -a&#xff08;顯示隱藏文件&#xff09;; ls -lh&#xff08;詳細列表易讀大小&#xff09; cd切換目錄cd ~&#xff08;主目錄&#xff09;; cd ..&#xff08;上級…

Java集合框架詳解與使用場景示例

Java集合框架是Java標準庫中一組用于存儲和操作數據的接口和類。它提供了多種數據結構&#xff0c;每種數據結構都有其特定的用途和性能特點。在本文中&#xff0c;我們將詳細介紹Java集合框架的主要組成部分&#xff1a;List、Set和Queue&#xff0c;并通過代碼示例展示它們的…

《Python星球日記》 第78天:CV 基礎與圖像處理

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、計算機視覺(CV)簡介1. 什么是計算機視覺?2. 計算機視覺的應用場景3. 圖像的基本屬性a》像素(Pixel)b》通道(Channel)c》分辨率(Res…

LabVIEW在電子電工教學中的應用

在電子電工教學領域&#xff0c;傳統教學模式面臨諸多挑戰&#xff0c;如實驗設備數量有限、實驗過程存在安全隱患、教學內容更新滯后等。LabVIEW 作為一款功能強大的圖形化編程軟件&#xff0c;為解決這些問題提供了創新思路&#xff0c;在電子電工教學的多個關鍵環節發揮著重…

【優選算法 | 字符串】字符串模擬題精選:思維+實現解析

算法相關知識點可以通過點擊以下鏈接進行學習一起加油&#xff01;雙指針滑動窗口二分查找前綴和位運算模擬鏈表哈希表 在眾多字符串算法題中&#xff0c;有一類題目看起來沒有太多算法技巧&#xff0c;卻經常讓人“翻車”——那就是字符串模擬題。這類題型往往不依賴復雜的數據…

虛幻引擎5-Unreal Engine筆記之Default Pawn與GamMode、Camera的關系

虛幻引擎5-Unreal Engine筆記之Default Pawn與GamMode、Camera的關系 code review! 文章目錄 虛幻引擎5-Unreal Engine筆記之Default Pawn與GamMode、Camera的關系1.Default Pawn與Camera的關系1.1. Default Pawn 是什么&#xff1f;1.2. Default Pawn 的主要組件1.3. Default…

HarmonyOs開發之———UIAbility進階

謝謝關注!! 前言:上一篇文章主要介紹開發之———使用HTTP訪問網絡資源:HarmonyOs開發之———使用HTTP訪問網絡資源-CSDN博客 代碼資源:https://download.csdn.net/download/this_is_bug/90841580 一、基本概念 UIAbility 是 HarmonyOS 應用的核心組件,負責用戶界面的…

java實現根據Velocity批量生成pdf并合成zip壓縮包

Velocity 模版操作 用的之前寫好的: 傳送門 其中需要新加一個轉成輸入流的方法 public static InputStream convertToPdf(StringWriter stringWriter) throws IOException {//將 HTML 轉為字節流byte[] htmlBytes stringWriter.toString().getBytes(StandardCharsets.UTF_8)…

SCDN能夠運用在物聯網加速當中嗎?

在當今的科技化時代當中&#xff0c;物聯網已經廣泛滲透在各個領域行業當中&#xff0c;隨著物聯網規模的不斷擴大&#xff0c;數據信息的傳輸速度和網絡穩定性成為企業需要重視的兩點因素&#xff0c;而SCDN也成為安全內容分發網絡作為一種融合了內容加速和安全防護的技術&…

二程運輸的干散貨船路徑優化

在二程運輸中&#xff0c;干散貨船需要將貨物從一個港口運輸到多個不同的目的地港口。路徑優化的目標是在滿足貨物運輸需求、船舶航行限制等條件下&#xff0c;確定船舶的最佳航行路線&#xff0c;以最小化運輸成本、運輸時間或其他相關的優化目標。 影響因素 港口布局與距離…

Oracle物理恢復相關注意點

如果需要恢復的數據庫或者數據文件不存在&#xff0c;則需要將全量備份集RESTORE[ 將全量備份集恢復到目標數據庫中&#xff0c;稱之為RESTORE。]到目標數據庫中&#xff0c;然后再RECOVER[ 將增量備份集或者歸檔日志恢復到目標數據庫中&#xff0c;稱之為RECOVER。]增量備份集…

C++ string小記

#include<string> using std::string;string s1; string s2 "hello" //初始化一個hello字符串 string s3(5,a) //連續5個字符a組成的串&#xff0c;即aaaaa///字符串操作int length s1.size() //.size()求字符串長度char c1 s1[1]; //從下標0開始&#xf…

自然語言處理入門級項目——文本分類(預處理)

文章目錄 前言1.數據預處理1.1數據集介紹1.2數據集抽取1.3劃分數據集1.4數據清洗1.5數據保存 2.樣本的向量化表征2.1詞匯表2.2向量化2.3自定義數據集2.4備注 結語 前言 本篇博客主要介紹自然語言處理領域中一個項目案例——文本分類&#xff0c;具體而言就是判斷評價屬于積極還…

C++面試2——C與C++的關系

C與C++的關系及核心區別的解析 一、哲學與編程范式:代碼組織的革命 過程式 vs 多范式混合 C語言是過程式編程的典范,以算法流程為中心,強調“怎么做”(How)。例如,實現鏈表操作需手動管理節點指針和內存。 C++則是多范式語言,支持面向對象(OOP)、泛型編程(模板)、函…

HTTP與HTTPS協議的核心區別

HTTP與HTTPS協議的核心區別 數據傳輸安全性 HTTP采用明文傳輸&#xff0c;數據易被竊聽或篡改&#xff08;如登錄密碼、支付信息&#xff09;&#xff0c;而HTTPS通過SSL/TLS協議對傳輸內容加密&#xff0c;確保數據完整性并防止中間人攻擊。例如&#xff0c;HTTPS會生成對稱加…

PotPlayer 安裝 madVR、LAV Filters 以提升解碼能力和視頻音頻效果

PotPlayer自帶的解碼器并不是最好&#xff0c;如下兩張截圖都是出自 TOP GUN: Maverick 較暗、灰蒙蒙的一張&#xff0c;是安裝插件之前明亮的一張&#xff0c;是安裝插件之后 詳細安裝參考 https://www.bilibili.com/video/BV1UV5qzuE74?spm_id_from333.788.videopod.sectio…

深入理解 OpenCV 的 DNN 模塊:從基礎到實踐

在計算機視覺領域蓬勃發展的當下&#xff0c;深度學習模型的廣泛應用推動著技術的不斷革新。OpenCV 作為一款強大且開源的計算機視覺庫&#xff0c;其 DNN&#xff08;Deep Neural Network&#xff09;模塊為深度學習模型的落地應用提供了高效便捷的解決方案。本文將以理論為核…

Spring MVC 中請求處理流程及核心組件解析

在 Spring MVC 中&#xff0c;請求從客戶端發送到服務器后&#xff0c;需要經過一系列組件的處理才能最終到達具體的 Controller 方法。這個過程涉及多個核心組件和復雜的映射機制&#xff0c;下面詳細解析其工作流程&#xff1a; 1. 核心組件與請求流程 Spring MVC 的請求處…

RISC-V 開發板 MUSE Pi Pro V2D圖像加速器測試,踩坑介紹

視頻講解&#xff1a; RISC-V 開發板 MUSE Pi Pro V2D圖像加速器測試&#xff0c;踩坑介紹 今天測試下V2D&#xff0c;這是K1特有的硬件級別的2D圖像加速器&#xff0c;參考如下文檔&#xff0c;但文檔中描述的部分有不少問題&#xff0c;后面會講下 https://bianbu-linux.spa…

hbase shell的常用命令

一、hbase shell的基礎命令 # 版本號查看 [rootTest-Hadoop-NN-01 hbase]$ ./bin/hbase version HBase 2.4.0 Source code repository git://apurtell-ltm.internal.salesforce.com/Users/apurtell/src/hbase revision282ab70012ae843af54a6779543ff20acbcbb629# 客戶端登錄 […