1. 程式人生 > >java實現二分查詢-兩種方式

java實現二分查詢-兩種方式

二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。

起初在資料結構中學習遞迴時實現二分查詢,實際上不用遞迴也可以實現,畢竟遞迴是需要開闢額外的空間的來輔助查詢。本文就介紹兩種方法

二分查詢演算法思想


有序的序列,每次都是以序列的中間位置的數來與待查詢的關鍵字進行比較,每次縮小一半的查詢範圍,直到匹配成功。


一個情景:將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

二分查詢圖示說明


圖片來源百度圖片,感謝分享者

二分查詢優缺點

優點是比較次數少,查詢速度快,平均效能好;

其缺點是要求待查表為有序表,且插入刪除困難。

因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。


使用條件:查詢序列是順序結構,有序。

java程式碼實現

使用遞迴實現

	/**
	 * 使用遞迴的二分查詢
	 *title:recursionBinarySearch
	 *@param arr 有序陣列
	 *@param key 待查詢關鍵字
	 *@return 找到的位置
	 */
	public static int recursionBinarySearch(int[] arr,int key,int low,int high){
		
		if(key < arr[low] || key > arr[high] || low > high){
			return -1;				
		}
		
		int middle = (low + high) / 2;			//初始中間位置
		if(arr[middle] > key){
			//比關鍵字大則關鍵字在左區域
			return recursionBinarySearch(arr, key, low, middle - 1);
		}else if(arr[middle] < key){
			//比關鍵字小則關鍵字在右區域
			return recursionBinarySearch(arr, key, middle + 1, high);
		}else {
			return middle;
		}	
		
	}

不使用遞迴實現(while迴圈)

	/**
	 * 不使用遞迴的二分查詢
	 *title:commonBinarySearch
	 *@param arr
	 *@param key
	 *@return 關鍵字位置
	 */
	public static int commonBinarySearch(int[] arr,int key){
		int low = 0;
		int high = arr.length - 1;
		int middle = 0;			//定義middle
		
		if(key < arr[low] || key > arr[high] || low > high){
			return -1;				
		}
		
		while(low <= high){
			middle = (low + high) / 2;
			if(arr[middle] > key){
				//比關鍵字大則關鍵字在左區域
				high = middle - 1;
			}else if(arr[middle] < key){
				//比關鍵字小則關鍵字在右區域
				low = middle + 1;
			}else{
				return middle;
			}
		}
		
		return -1;		//最後仍然沒有找到,則返回-1
	}

測試

測試程式碼:

	public static void main(String[] args) {

		int[] arr = {1,3,5,7,9,11};
		int key = 4;
		//int position = recursionBinarySearch(arr,key,0,arr.length - 1);
		
		int position = commonBinarySearch(arr, key);

               if(position == -1){
			System.out.println("查詢的是"+key+",序列中沒有該數!");
		}else{
			System.out.println("查詢的是"+key+",找到位置為:"+position);
		}
		
	}

recursionBinarySearch()的測試:key分別為0,9,10,15的查詢結果
查詢的是0,序列中沒有該數!

查詢的是9,找到位置為:4

查詢的是10,序列中沒有該數!

查詢的是15,序列中沒有該數!

commonBinarySearch()的測試:key分別為-1,5,6,20的查詢結果

查詢的是-1,序列中沒有該數!

查詢的是5,找到位置為:2

查詢的是6,序列中沒有該數!

查詢的是20,序列中沒有該數!

時間複雜度

採用的是分治策略

最壞的情況下兩種方式時間複雜度一樣:O(log2 N)

最好情況下為O(1)

空間複雜度

  演算法的空間複雜度並不是計算實際佔用的空間,而是計算整個演算法的輔助空間單元的個數

非遞迴方式:
  由於輔助空間是常數級別的所以:
  空間複雜度是O(1);

遞迴方式:

 遞迴的次數和深度都是log2 N,每次所需要的輔助空間都是常數級別的:
 空間複雜度:O(log2N )

相關推薦

java實現二分查詢-方式

二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。 起初在資料結構中學習遞迴時實現二分查詢,實際上不用遞迴也可以實現,畢竟遞迴是需要開闢額外的空間的來輔助查詢。本文就介紹兩種方法 二分查詢演算法思想 有序的序列,每次都是以序列的中間位置的數來與待查詢的關鍵字進行比

java實現二分查詢演算法,方式實現,非遞迴和遞迴

java實現二分查詢演算法 1、概念 2、前提 3、思想 4、過程 4、複雜度 5、實現方式 1. 非遞迴方式 2. 遞迴方式

java實現同步的幾方式(總結)

副本 增刪改 否則 都是 fin ret 語義 value art 為何要使用同步? java允許多線程並發控制,當多個線程同時操作一個可共享的資源變量時(如數據的增刪改查), 將會導致數據不準確,相互之間產生沖突,因此加入同步鎖以避免在該線程沒有完成操

CSS3實現動畫的方式

logs del pin 屬性 cnblogs ase http eve 括號 1、設置transition設置過渡,添加transform設置形狀,形成動畫效果,如下: .divadd { transition: All 0.4s ease-in-out;

css實現透明的方式及其區別

白色 class 子節點 new 透明度 區別 方式 ron pre 一、opacity:0~1 值越高,透明度越低,下面為示例 選擇器{ opacity:0.5 } 選擇器匹配到的節點們,包括節點們的孩子節點,都會實現%50透明,另 0.5 可直

java Web釋出的方式

一種是直接呼叫API: Endpoint.publish("http://192.168.14.117:8888/java6ws/Java6WS", new Java6WS()); Endpoint.publish是一個後臺執行緒,一旦釋出了就會一直等待處理Web服務的請求,只有當mai

java——實現二分查詢

二分查詢又稱折半查詢,它是一種效率較高的查詢方法。 折半查詢的演算法思想是將數列按有序化(遞增或遞減)排列,查詢過程中採用跳躍式方式查詢,即先以有序數列的中點位置為比較物件,如果要找的元素值小 於該中點元素,則將待查序列縮小為左半部分,否則為右半部分。通過一次比較,將查詢區間縮小一半。 折半

java 傳遞引數的方式

                Java中沒有指標,所以也沒有引用傳遞了,僅僅有值傳遞不過可以通過物件的方式來實現引用傳遞 類似j

Java獲取年月日的方式

方式一: Calendar calendar = Calendar.getInstance(); System.out.println(calendar.get(Calendar.YEAR)); Sy

實現AJAX的方式

第一種通過XMLHttpRequest實現: 需要手動建立XMLHttpRequest物件,較繁瑣。 js程式碼: <script type="text/javascript"> function getComments(){ //獲得評論框內

java實現二分查詢

1.二分查詢有個前提,就是陣列必須是有序的,而且是從小到大排序 2.先定義一個有序陣列: int[] nums={1,3,4,5,6,8,9,11} 3. 下面就是來看二分查詢原理 設定三個下標: 左下標 left=0; 右邊下標right=nums.length

不用自定義,ImageView實現圓角的方式

不多廢話,直切主題。 方案一、利用CardView巢狀ImageView實現圓角。具體實現方式見文章《CardView的使用》 方案二、利用Glide的RequestOptions.bitmapTransform來實現,很簡單,具體如下: RoundedCorn

Java實現克隆的三方式

1. 淺克隆      2. 深克隆     3. 利用序列化實現深克隆 1、淺複製(淺克隆)這種淺複製,其實也就是把被複制的這個物件的一些變數值拿過來了。最後生成student2還是一個新的物件。 public class

JAVA 建立程序的方式

在Java中建立執行緒有兩種方式:繼承Thread類或者實現Runnable介面再重寫run()方法 那麼在Java中要如何建立程序呢? 同樣也有兩種方法 通過ProcessBuilder.start()方法 先看程序類Process publ

java 呼叫http介面方式

import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.Input

Handler實現倒計時的方式

背景: 最近專案中,正好做到登入/註冊這個功能塊。它需要通過傳送驗證碼,在規定的時間內用驗證碼來完成登入/註冊。之前的專案中也有這個功能,但是覺得太複雜了,只好自己重新實現一遍。用Handler來做,覺得程式碼簡介,邏輯也清楚。 程式碼一: //在

Java實現websocket 的方法

一.WebSocket簡單介紹  隨著網際網路的發展,傳統的HTTP協議已經很難滿足Web應用日益複雜的需求了。近年來,隨著HTML5的誕生,WebSocket協議被提出,它實現了瀏覽器與伺服器的全雙工通訊,擴充套件了瀏覽器與服務端的通訊功能,使服務端也能主動向客戶端傳送資料。  我們知道,傳統的HTTP協議

SparkSQL 實現UDF的方式

import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.sql.SQLContext import org.apache.spark.sql.functions._ /** *

java 實現二分查詢

/** * 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。   【二分查詢要求】:1.必須採用順序儲存結構 2.必須按關鍵字大小有序排列。 * @author Administrator * */ public class BinarySearch { p

Java 實現二分查詢\折半查詢(速度快的查詢有序列表)

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。         該演算法要求:         1、  必須採用順序儲存結構。         2、  必須按關鍵