資料結構與演算法(九) 查詢

2022-01-10 00:00:35 字數 3124 閱讀 9823

查詢是在大量的資訊中尋找乙個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。

定義:根據給定的某個值,在查詢表中確定乙個其關鍵字等於給定值的資料元素(或記錄)。

分類:靜態查詢和動態查詢

無序查詢和有序查詢。

遍歷陣列並且依次對比值,相等時返回下標

/**

* 在給定陣列中線性查詢指定元素

* @param arr

* @param target

* @return

*/public static int search(int arr,int target)

}return -1;

}

查詢不含有重複數字的情況:

/**

* 二分查詢不重複目標

* @param arr 查詢的數字

* @param left 左指標

* @param right 右指標

* @param target 查詢目標

* @return

*/public static int search(int arr, int left, int right, int target)

//獲取中位數

int mid = (right + left) / 2;

//如果目標比中位數小,向左遞迴

if (arr[mid] > target) else if (arr[mid] < target) else

}

查詢含有重複數字的情況:

/**

* 二分查詢重複目標

* @param arr 查詢的數字

* @param left 左指標

* @param right 右指標

* @param target 查詢目標

* @return

*/public static listsearch(int arr, int left, int right, int target)

//獲取中位數

int mid = (right + left) / 2;

//如果目標比中位數小,向左遞迴

if (arr[mid] > target) else if (arr[mid] < target) else

targets.add(tempindex);

tempindex--;

}//放入中間值

targets.add(mid);

//向右查詢相同的數

tempindex = mid + 1;

while (true)

targets.add(tempindex);

tempindex++;

}return targets;}}

插值查詢與二分查詢基本一致,但是不一樣的是不再像二分那樣總是將陣列均勻分為兩份,而是通過公式將分割的中間點自適應定在目標元素附近。

即將原先的mid計算方式換成這個:

//將原先的1/2換為(key-a[low])/(a[high]-a[low])

mid=low+(high-low)*(key-a[low])/(a[high]-a[low])

由於mid的計算方式改為由查詢數動態計算,所以為了防止取arr[mid]時下標越界,我們需要新的邊界條件:

所以**實現如下:

/**

* 插值查詢

* @param arr 查詢的數字

* @param left 左指標

* @param right 右指標

* @param target 查詢目標

* @return

*/public static listsearch(int arr, int left, int right, int target)

//獲取中位數

int mid = left + (right - left) * (target - arr[left]) / (arr[right] - arr[left]);

int midval = arr[mid];

//如果目標比中位數小,向左遞迴

if (midval > target) else if (midval < target) else

targets.add(tempindex);

}//放入中間值

targets.add(mid);

//向右查詢相同的數

tempindex = mid + 1;

while (true)

targets.add(tempindex);

}return targets;}}

舉個例子, 就是乙個斐波那契數列,他有兩個特點:

/**

* 斐波那契陣列長度

*/public final static int maxsize = 20;

/** * 獲得乙個斐波那契數列,用於提供陣列分割點位置

* @return

*/public static int getfibonacci()

return f;

}/**

* 斐波那契查詢

* @param arr

* @param target

* @return

*/public static int search(int arr, int target)

//將陣列長度延長到f[k]

int temp = arrays.copyof(arr, f[k]);

//將延長的那部分用原陣列的最後一位填充

for (int i = right + 1; i < f[k]; i++)

//查詢目標數字

while (left <= right) else if (target > temp[mid]) else else }}

return -1;

}

資料結構與演算法(九) 查詢與排序

打卡第九天 快速排序 c 異常處理沒有搞定 lll 排序陣列本身就是陣列旋轉的乙個特例。在對陣列進行排序或查詢時,要注意陣列中有相同數字的特例,比如下面的旋轉陣列的時候 查詢 順序查詢 二分查詢 雜湊表查詢 二叉排序查詢 排序 插入排序 氣泡排序 歸併排序 快速排序 實現快速排序演算法的關鍵在於先在...

資料結構與演算法 實驗九

求二叉樹的層序遍歷問題 要求 1 編寫乙個建立二叉樹的函式。2 編寫按層次 同一層自左至右 輸出二叉樹中所有的結點的函式。3 編寫乙個測試主函式。include includetypedef char elemtype include bitree.h typedef bitreenode data...

資料結構與演算法(查詢)

1 查詢表 用於查詢的資料集合,由同一型別的資料元素組成,經常進行的操作 2 靜態查詢表 無需動態修改查詢表的操作,都是靜態查詢表。適合的查詢方法有順序查詢 折半查詢 雜湊查詢。3 動態查詢表 需要動態插入或刪除的操作。適合的查詢方法有二叉排序樹查詢 雜湊查詢。4 關鍵字 資料元素中唯一表示該元素的...