插值查找
插值查找算法又称插值搜索算法,是在二分查找算法的基础上改进得到的一种查找算法。
插值查找算法只适用于有序序列,换句话说,它只能在升序序列或者降序序列中查找目标元素。作为“改进版”的二分查找算法,当有序序列中的元素呈现均匀分布时,插值查找算法的查找效率要优于二分查找算法;反之,如果有序序列不满足均匀分布的特征,插值查找算法的查找效率不如二分查找算法。
所谓均匀分布,是指序列中各个相邻元素的差值近似相等。例如,{10, 20, 30, 40, 50} 就是一个均匀分布的升序序列,各个相邻元素的差值为 10。再比如 {100, 500, 2000, 5000} 是一个升序序列,但各相邻元素之间的差值相差巨大,不具备均匀分布的特征。
插值查找算法的解题思路和二分查找算法几乎相同,唯一的区别在于,每次与目标元素做比较的元素并非搜索区域内的中间元素,此元素的位置需要通过如下公式计算得出:
mid=left+(right-left)*(value-arr[left]) / (arr[right]-arr[left])
public class InsertSort { public static void main(String[] args) { int arr[] = new int[100]; for (int i = 0; i < 100; i++) { arr[i] = i+1; } int i = insertSort(arr, 0, arr.length-1, 88); System.out.println("找到的索引为:"+i); } /* * @param arr: 传入的数组 * @param left: 数组左边索引 * @param right: 数组右边索引 * @param findV: 要查找的值 * @return: int :查找到的下标 * return -1 :没有要查找的值 * @description: 要求数组有序 是和均匀分布的数列 例如等差数列 */ public static int insertSort(int arr [],int left,int right,int findV){ System.out.println("调用"); if (left >right || findV < arr[0] ||findV > arr[arr.length-1]){ return -1; } // 找到中间元素所在的位置 int mid = left +(right-left) *(findV -arr[left])/(arr[right]-arr[left]); int midV = arr[mid]; if (findV > midV){ return insertSort(arr,mid+1,right,findV); } if (findV < midV){ return insertSort(arr,left,mid-1,findV); } else return mid; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律