减治法在查找算法中的应用
折半查找:(时间复杂度O(log以2为底n的对数))
对于有序数组的查找来说,折半查找是一种非常高效的算法,其基本原理为:比较查找键k和数组中间元素a[m],如果相等,算法结束;如果k<a[m],对数组前半部分执行操作;如果k>a[m],对数组后半部分执行操作。
public class Main {static int k = 89;static int[] a = {17, 29, 34, 45, 68, 89, 90};public static void main(String[] args) {int l = 0;int r = a.length-1;System.out.println(f(l, r));}private static int f(int l, int r) {while (l <= r) {int m = (l+r)/2;if (k == a[m]) {return m;} else if (k < a[m]) {return f(l, m-1);} else {return f(m+1, r);}}return -1;}
}
发现问题:对于依赖键值操作的查找算法来说,折半查找已经是最优的查找算法了,但是还是有些算法具有更优良的平均效率
解决思路:插值查找,散列查找(散列法甚至不需要输入数组是有序的)
插值查找:不同于折半查找总是把查找值和给定有序数组的中间元素比较(将问题规模削减一半),差值查找更像是在字典中查字的形式,如果我们找“班”这个字,那么我们一定先找“B”字母的区域,我们不会去从字典中间区域开始。准确来说,插值查找同样采用比较的方式,但是它考虑了查找键的值。
实际上对于较小数据的查找,折半会更好;而对于大数据量而言,插值查找则更值得考虑。