java 二分查詢、插值查詢
一、思想
二分查詢:又稱折半查詢,是順序查詢的優化
查詢序列要求:有序
二分查詢就是每次取中間位置的資料,將陣列分成兩部分,將目標值與中間值做比較,大於中間值則下次從右側陣列開始查詢,小於中間值,下次從左側陣列開始查詢,以此迴圈,直到中間值即為查詢值,範圍位置即可。
二、實現程式碼
非遞迴:
public static int getX(int[] data, int x) { int start = 0; int end = data.length - 1; if(start>end||data[start]<x||data[end]>x){ return -1; } while (start <= end ) { int mid = (start + end) / 2; if (data[mid] > x) { end = mid - 1; } else if (data[mid] < x) { start = mid + 1; }else { return mid; } } return -1; }
小結:
第一步先判斷不符合要求的資料,如開始的大於結尾的,查詢的數不在範圍內。
mid屬於每次都會變化的資料,要放在迴圈體中
遞迴:
public static int getResult(int[] data, int low, int high, int x) {
int mid = (low + high) / 2;
if (data[low] > data[high] || x > data[high] || x < data[low]) {
return -1;
}
if (x < data[mid]) {
high = mid - 1;
return getResult(data, low, high, x);
} else if (x > data[mid]) {
low = mid + 1;
return getResult(data, low, high, x);
} else {
return mid;
}
}
小結:
遞迴時候整個程式就相當於迴圈體,做好限制條件,即停止的條件,就可以不斷迴圈。
優化
插值查詢:是對二分查詢的優化
插值查詢:是根據要查詢表中最大最小記錄的關鍵字比較後的查詢方法,其核心是插值的計算公式:
mid = low + (high-low)(key- a[low] )/(a[high]-a[low])
複雜度為O(logn)
當關鍵字分佈比較均勻的查詢來說,插值演算法的平均性比這半查詢好得多,反之,則不一定
相關推薦
java 二分查詢、插值查詢
一、思想 二分查詢:又稱折半查詢,是順序查詢的優化 查詢序列要求:有序 二分查詢就是每次取中間位置的資料,將陣列分成兩部分,將目標值與中間值做比較,大於中間值則下次從右側陣列開始查詢,小於中間值,下次從左側陣列開始查詢,以此迴圈,直到中間值即
順序查詢,折半查詢,插值查詢
1.順序查詢 從陣列起始掃描到陣列結尾,判斷該索引陣列是否和關鍵字相等,成功返回1 程式碼如下: //順序查詢 int seqSearch(int *array, int low, int high, int key) { for (int i = low; i < high;
二叉搜尋樹的查詢、最值查詢、插入和刪除
對於一棵二叉搜尋樹,如果不為空,它應該滿足以下三個特點:1、樹上的任一結點,該結點的值都大於它的非空左子樹的值。2、樹上的任一結點,該結點的值都小於它的非空右子樹的值。3、任一結點的左右子樹都是二叉搜尋樹。對於二叉搜尋樹的查詢,思路方法是:1、從根結點開始查詢,如果樹為空,就
插值查詢方法(優於二分查詢)
插值查詢方法是在二分法相同方法的基礎上進行了一個優化 程式碼如下 package 插值查詢; import java.util.Arrays; import java.util.Scanner; public class Display { public int interpolation(i
快速排序 and 拉格朗日插值查詢
private static void QuictSort(int[] zu, int left, int right) { if (left < right) { int i = 0;
小川學習筆記--JAVA一個類實現多種排序(氣泡排序、快速排序、選擇排序、插值排序)
JAVA氣泡排序、快速排序、選擇排序、插值排序 作者:程式猿劉小川 public static void main(String[] args) //主程式 { int data[] = {5,7,1,0,2,3,4,66,9,8};
JAVA一個類實現多種排序(氣泡排序、快速排序、選擇排序、插值排序)
JAVA氣泡排序、快速排序、選擇排序、插值排序 作者:程式猿劉小川 public static void main(String[] args) //主程式 { int data[] = {5,7,1,0,2,3
查詢-二分查詢、三分查詢
二分查詢的查詢過程是: 每輪與有序區間的中間元素進行比較,若相等則返回當前元素位置。若被查詢元素大於中間元素,則到右側區間查詢,若查詢元素小於中間元素,則到左側區間查詢。 不斷重複前序查詢過程,或者待查詢區間失效。 輸入:表的長度,表中各個元素。要查詢的表元素。 輸出
插值查詢
在介紹插值查詢之前,首先考慮一個問題,為什麼二分查詢演算法中一定是折半,而不是折四分之一,或者折更多呢?打個比方,在英文字典裡面查“apple”,你下意識翻開字典是翻前面的書頁還是後面的書頁呢?如果再查“zoo”,又該怎麼查呢?很顯然,這兩個單詞絕對不會從中間開始查起,而是有一定目的地從前或從後開始查;同樣地
拉格朗日插值查詢法-C描述
與二分查詢法相似,也是必須先進行排序,對比二分查詢法只修改一行程式碼 int binarySearch(void *p, int key ,int size ) { int *arr = p;
ElasticSearch學習(十一)在Java應用中實現聚合查詢、query string查詢
//聚合查詢 @Test public void test20() throws Exception { //指定ES叢集 Settings settings = Settings.builder().put("clus
mysql查詢最後幾條、生成一條包含多條記錄、插入語句、差值查詢
1、查詢第一行記錄: select * from table limit 1 2、查詢第n行到第m行記錄 select * from table1 limit n-1,m-n; SELECT
知識類API調用的代碼示例合集:駕考題庫、ISBN書號查詢、萬年歷查詢等
system 之間 HP sts efault text set verify base 以下示例代碼適用於 www.apishop.net 網站下的API,使用本文提及的接口調用代碼示例前,您需要先申請相應的API服務。 駕考題庫:獲取駕考題目與答案 ISBN書號查詢:
Hibernate_day04---HQL查詢、QBC查詢、多表查詢、檢索策略、批量抓取
一、Hibernate查詢方式及結果存放 查詢方式(五種) 1)物件導航查詢 :一對多中,查詢某個"一"對應的所有"多" 2)OID查詢: 根據id查詢某一條記錄,返回物件 3)HQL查詢: 使用Query物件,內建hql語句實現查詢。 4)QBC查詢:使用Criter
Mybatis實現增刪改查、模糊查詢、多條件查詢
專案總體結構如下: 資料庫準備:在 資料庫dbmybatis中建立一張category的表,我錄入了幾條記錄方便測試,表字段結構如下圖: 1.建立好了表後使用idea新建一個Maven專案,pom.xml加入如下依賴: <dependencies> &
$Django 聚合函式、分組查詢、F,Q查詢、orm欄位以及引數
一.聚合函式 from django.db.models import Avg,Sum,Max,Min,Count,F,Q #匯入 # .查詢圖書的總價,平均價,最大
$Django 聚合函數、分組查詢、F,Q查詢、orm字段以及參數
binary ipaddress str 聚合 cnblogs spa bigint tps ive 一.聚合函數 from django.db.models import Avg,Sum,Max,Min,Count,F,Q #導入 # .查詢圖書的
用PostgreSQL 做實時高效 搜尋引擎 - 全文檢索、模糊查詢、正則查詢、相似查詢、ADHOC查詢
用PostgreSQL 做實時高效 搜尋引擎 - 全文檢索、模糊查詢、正則查詢、相似查詢、ADHOC查詢作者digoal 日期2017-12-05 標籤PostgreSQL , 搜尋引擎 , GIN , ranking , high light , 全文檢索 , 模糊查詢 , 正則查詢 , 相似查詢 ,
判斷流程例項狀態、歷史流程例項查詢、歷史活動查詢
判斷流程例項狀態、歷史流程例項查詢、歷史活動查詢 標籤(空格分隔): activiti 1.判斷流程例項狀態 下面是一個示例程式碼: /** * 獲取預設流程引擎例項,會自動讀取activiti.cfg.xml文字 */ private ProcessEngine
折半查詢和差值查詢
都用於有序陣列,下面假設單增 折半查詢思想簡單,直接寫了 public static int BinarySearch(int a[],int k) { int l=0; int r=a.length-1; while(l<=r) { int m=(l+r)