順序 二分 折半 索引 分塊查詢

2021-09-19 03:44:24 字數 2046 閱讀 1728

**實現

public static int ordersearch(int arr, int target)
效能分析時間複雜度o(n)

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

兩個條件:1)序列有序;2)可以隨機訪問

查詢過程

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

**實現

public static int bisearch(int arr, int target) 

return -1;

}

效能分析時間複雜度:

因為二分查詢每次排除掉一半的不適合值,所以對於n個元素的情況:

一次二分剩下:n/2 

兩次二分剩下:n/2/2 = n/4

…….

m次二分剩下:n/(2^m)

在最壞情況下是在排除到只剩下最後乙個值之後得到結果,即

n/(2^m)=1

所以由上式可得 : 2^m=n

進而可求出時間複雜度為: log2(n)

折半查詢雖然具有很好的效能,但其前提條件時線性表順序儲存而且按照關鍵碼排序,這一前提條件在結點樹很大且表元素動態變化時是難以滿足的。而順序查詢可以解決表元素動態變化的要求,但查詢效率很低。如果既要保持對線性表的查詢具有較快的速度,又要能夠滿足表元素動態變化的要求,則可採用分塊查詢的方法。

當增加或減少節以及節點的關鍵碼改變時,只需將該節點調整到所在的塊即可。在空間複雜性上,分塊查詢的主要代價是增加了乙個輔助陣列。

方法描述

分塊查詢要求把乙個大的線性表分解成若干塊,每塊中的節點可以任意存放,但塊與塊之間必須排序。假設是按關鍵碼值非遞減的,那麼這種塊與塊之間必須滿足已排序要求,實際上就是對於任意的i,第i塊中的所有節點的關鍵碼值都必須小於第i+1塊中的所有節點的關鍵碼值。還要建立乙個索引表(索引表中為每一塊都設定索引項,每乙個索引項都包含兩個內容)

顯然,索引表是按關鍵字非遞減順序排列的。

一般先用二分查詢索引表,確定需要查詢的關鍵字在哪一塊,然後再在相應的塊內用順序查詢。

**實現

public boolean search(int data) 

}return false;

}/**

* 二分查詢

*/private int binarysearch(int value) else

}return start;

}

效能分析這種帶索引表的分塊有序表查詢的時間效能取決於兩步查詢時間之和:如前面所述,第一步可以採用簡單順序查詢和折半查詢之一進行。第二步只能採用簡單順序查詢,但由於子表的長度較原表的長度小。因此,其時間效能介於順序查詢和折半查詢之間。

假設索引表有n個元素,每塊含有s個元素,平均查詢長度為:asl=(n/s+s)/2 +1,時間複雜度為o(n)~o(log2n)

綜合比較

null

順序查詢

二分查詢

分塊查詢

表的結構

有序、無序

有序塊內無序、塊間有序

表的儲存

順序、鏈式

順序順序、鏈式

平均查詢長度

最大最小

中間時間複雜度

o(n)

o(log2n)

中間原文: 

二分 折半 查詢

折半查詢 又叫二分查詢,採用分治思想,適用於不經常變動且查詢頻繁的表 演算法思想 將n個元素 假設n個元素公升序 分為大致相同的兩部分,取data n 2 與目標元素m比較 若data n 2 m return n 2 若data n 2 m 則我們只要在data的左半部分繼續查詢 若data n ...

二分 折半 查詢

二分查詢 請對乙個有序陣列進行二分查詢 輸入乙個數看看該陣列是否存在此數,並且求出下 標,如果沒有就提示 沒有這個數 二分查詢演算法的思路 二分 折半 查詢條件 有序陣列。public class binarysearch 不考慮有重複元素的查詢。int index solutionsearch a...

三種靜態查詢演算法 順序 二分 折半 索引 分塊查詢

終於找了個時間,把三種靜態查詢演算法簡單總結了一下,與大家分享討論。簡介順序查詢是在乙個已知無 或有序 序佇列中找出與給定關鍵字相同的數的具體位置。原理是讓關鍵字與佇列中的數逐個比較,直到找出與給定關鍵字相同的數為止。實現 public static intordersearch int arr,i...