1. 程式人生 > 其它 >查詢元素的幾種常用方法

查詢元素的幾種常用方法

技術標籤:演算法java

查詢元素的幾種常用方法

1.順序查詢

順序查詢的思想很簡單,就是遍歷陣列,和需要查詢的元素進行比較,直到匹配為止。

在這裡插入圖片描述

int OrderFind(int arr[], int value){
        int index = 0;     //value值對應陣列的索引
        for (int i = 0; i < arr.length; i++)
        {
            if (arr[i] == value)
            {
                index =
i; break; } } return index+1; }

對於這個演算法,最好的情況很顯然就是需要查詢的元素在第一個位置,所以時間複雜度為O(1)

最壞的情況就是需要查詢的元素在最後一個位置,所以時間複雜度為O(n)

很顯然平均複雜度為O(n/2)

2.折半查詢

折半查詢對陣列的要求有點高,就是需要陣列是已經排好序的。演算法思想就是首先確定中間值(一開始為陣列索引最中間的那個數),然後和需要查詢的元素進行比較大小,如果小於,則放到小於中間值的區域,反之則進行相反的操作,然後又進行同樣的操作,直到區域的左右區間相等(如果此時仍沒有找到需要查詢的元素)。

在這裡插入圖片描述

int FindByHalf(int[] arr,int left,int right,int value){
        int middle = (left+right)/2;
        if(left > right){
            System.out.println("沒有找到元素!");
            return -1;
        }
        if (value == arr[middle]){
            return middle;
        }
        else {
            if
(value > arr[middle]){ return FindByHalf(arr, middle+1, right, value); } else { return FindByHalf(arr, left, middle-1, value); } } }

3.分塊查詢

分塊查詢是順序查詢的一個改進。分塊查詢的思想就是將n個數據元素“按塊有序”劃分為m塊(m<=n)。每一塊中的資料元素不必有序,但塊與塊之間必須“按塊有序”,即第1塊中的最大的元素必須小於第2塊中最小的元素;而第2塊中最大的元素又小於第3塊中的最小的元素,如此反覆。然後在每一塊中找出最大的元素和它的索引,建立一個索引表。因為索引表是有序的,如果說索引表很長的話,可以採用折半查詢來查詢被查詢的元素在哪一塊區域,然後在區域中通過順序查詢來查詢對應的元素。

int BlockFind(HashMap<Integer,Integer> I,int b,int n,int arr[],int value)
    {
        int number;   //每一塊的元素個數
        if ( n % b == 0)
            number = n / b;
        else
            number =  (n /b) + 1;
        int low = 0, high = b-1,mid,i;
        while (low <= high)
        {
            mid = (low + high)/2;
            if (I.get(mid) >= value)
            {
                high = mid - 1;
            }
            else
            {
                low = mid + 1;
            }
        }
        i = (high + 1) * number;
        while (i < (high + 2) * number && arr[i] != value && i < arr.length)  //i < arr.length是為了防止最後一組越界
        {
            i++;
        }
        if (i < (high + 2) * number)
        {
            return i+1;
        }
        else
        {
            return -1;
        }
    }

由於博主的水平限制,可能會有一些問題,希望大家指正。