1. 程式人生 > >java 二分查詢、插值查詢

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)