# 二分查找算法(Algorithms)第一章

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36285124/article/details/74315534

算法(Algorithms)第一章

2017.7.3

配套资源网站:algs4.cs.princeton.edu。(如果你是初学者,不知道如何配置环境,如果你跟我遇到了相同的困难,在终端运行死活不成功,非常感谢这位博主给我提供了帮助:算法第四版详细配置,文章是17年一月份写的,对我的帮助很大,博主是使用eclipse编译的,然后再使用命令行去运行。按照博主的项目结构就可以。也可以参考我的项目 分支chapter1里边的代码。) 我的GitHub地址
1. java基本数据类型有八种:(再巩固了一下!)
* 一个字节代表八位二进制数,也就是8位。
* 六个数字(byte(8位),short(16位),int(32位),long(64位),float(32位),double(64位)),
* 字符型char(16位,两个字节)
* 逻辑型Boolean(1位)
2. 二分查找算法。
二分查找算法是比较著名的、高效、应用广泛的。
首先主要方法为下边的 indeOf 方法,需要两个参数
1. 一个有序的int型数组
2. 要查找的数字 也就是key值
返回值有两种
1. 如果返回-1 则说明没有当前要找的key
2. 如果返回为>=0 的整数,则说明在数组中下标为该返回值
普通实现方法如下:

public static int indexOf(int[] a, int key) {
        int lo = 0;
        int hi = a.length - 1;
        while (lo <= hi) {
            // 被查找的键必定在 lo 到 hi 之间,或者是不存在.
            int mid = lo + (hi - lo) / 2;
            if      (key < a[mid]) hi = mid - 1;
            else if (key > a[mid]) lo = mid + 1;
            else return mid;
        }
        return -1;
    }
public static void main(String[] args)
{
     int[] whitelist = In.readInts(args[0]);
      Arrays.sort(whitelist);
     while (!StdIn.isEmpty())
           { // 读取键值,如果不存在于白名单中则将其打印
              int key = StdIn.readInt();
              if (rank(key, whitelist) < 0)
              StdOut.println(key);
}}

递归实现防范如下:

//  二分查找的递归实现
    public static int rank1(int key, int[] a)
    { 
        return rank(key, a, 0, a.length - 1); 
        }
    public static int rank(int key, int[] a, int lo, int hi)
    { //如果key存在于a[]中,它的索引不会小于lo且不会大于hi
         if (lo > hi) return -1;
         int mid = lo + (hi - lo) / 2;
         if (key < a[mid]) return rank(key, a, lo, mid - 1);
         else if (key > a[mid]) return rank(key, a, mid + 1, hi);
         else return mid;
    }

原理:

二分法超找就是取中间的值,来做比较,判断大小后缩小查找范围,一步一步采用递归实现查找出对应的下标,如果没有就跳出循环,返回-1.
二分的核心就是一直不断的分成两份,来缩小范围。应用场景可以设定好白名单,然后可以查找出不在白名单里边的数据来过滤数据。例如银行账户通常是百万级别的,采用二分查找就会提高很大的效率!
原理图

猜你喜欢

转载自blog.csdn.net/qq_36285124/article/details/74315534