查詢是在大量的資訊中尋找乙個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。
定義:根據給定的某個值,在查詢表中確定乙個其關鍵字等於給定值的資料元素(或記錄)。
分類:靜態查詢和動態查詢
無序查詢和有序查詢。
遍歷陣列並且依次對比值,相等時返回下標
/**
* 在給定陣列中線性查詢指定元素
* @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 關鍵字 資料元素中唯一表示該元素的...