数据结构与算法(九):查找
2021-05-01 04:29
标签:信息 str 需要 bag lse 大量 割点 integer for 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。 定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。 分类: 静态查找和动态查找 无序查找和有序查找。 遍历数组并且依次对比值,相等时返回下标 查找不含有重复数字的情况: 查找含有重复数字的情况: 插值查找与二分查找基本一致,但是不一样的是不再像二分那样总是将数组均匀分为两份,而是通过公式将分割的中间点自适应定在目标元素附近。 即将原先的mid计算方式换成这个: 由于mid的计算方式改为由查找数动态计算,所以为了防止取arr[mid]时下标越界,我们需要新的边界条件: 所以代码实现如下: 斐波那契查找跟差值查找一样从中位数mid上下文章,但是又有不同之处,要想理解斐波那契查找的思路,需要先了解一下斐波那契数列: 举个例子, {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 就是一个斐波那契数列,他有两个特点: 由于F[k] = F[k-1] + F[k-2],我们能推出(F[k]-1)=(F[k-1]-1)+(F[k-2]-1)+1,也就是说: 若数组的长度F[k]-1,则每一数组可以被分成长度为F[k-1]-1和F[k-2]-1的两段,两段的平分点mid即有mid=low+F[k-1]-1 但数组长度n不一定刚好等于F[k]-1,所以需要将原来的顺序表长度n增加至F[k]-1。新增的位置(从n+1到F[k]-1位置),都赋为n位置的值即可 举个例子:延长{1,8, 10, 89, 1000, 1234},得到{1,8, 10, 89, 1000, 1234, 1234, 1234}, 数据结构与算法(九):查找 标签:信息 str 需要 bag lse 大量 割点 integer for 原文地址:https://www.cnblogs.com/Createsequence/p/13221730.html
一、线性查找
/**
* 在给定数组中线性查找指定元素
* @param arr
* @param target
* @return
*/
public static int search(int[] arr,int target) {
for (int i = 0; i
二、二分查找
1.思路分析
2.代码实现
/**
* 二分查找不重复目标
* @param arr 查找的数字
* @param left 左指针
* @param right 右指针
* @param target 查找目标
* @return
*/
public static int search(int[] arr, int left, int right, int target) {
//由于每次遍历右指针总是右移,左指针总是右移
//所以当如果查找的是一个不存在的数时,即右指针小于左指针
if (right target) {
return search(arr, left, mid - 1, target);
} else if (arr[mid]
/**
* 二分查找重复目标
* @param arr 查找的数字
* @param left 左指针
* @param right 右指针
* @param target 查找目标
* @return
*/
public static List
三、插值查找
//将原先的1/2换为(key-a[low])/(a[high]-a[low])
mid=low+(high-low)*(key-a[low])/(a[high]-a[low])
/**
* 插值查找
* @param arr 查找的数字
* @param left 左指针
* @param right 右指针
* @param target 查找目标
* @return
*/
public static List
四、斐波那契查找
1.思路分析
2.代码实现
/**
* 斐波那契数组长度
*/
public final static int MAXSIZE = 20;
/**
* 获得一个斐波那契数列,用于提供数组分割点位置
* @return
*/
public static int[] getFibonacci() {
int[] f = new int[MAXSIZE];
f[0] = 1;
f[1] = 1;
for (int i = 2; i f[k] - 1) {
k++;
}
//将数组长度延长到f[k]
int[] temp = Arrays.copyOf(arr, f[k]);
//将延长的那部分用原数组的最后一位填充
for (int i = right + 1; i temp[mid]) {
//向分割点右边查找
left = mid + 1;
k-=2;
}else {
//找到要查找的数字
//判断要返回的下标
if (mid