《算法》学习之二分查找
Posted 算法小白的进阶之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法》学习之二分查找相关的知识,希望对你有一定的参考价值。
这段程序接受一个白名单文件(一列整数)作为参数,并会过滤掉标准输入中的所有存在于白名单中的条目,仅将不在白名单上的整数打印到标准输出中。
import java.util.Arrays;
public class BinarySearch
{
public static int rank(int key, int[] a)
{ // 数组必须是有序的
int lo = 0;
int hi = a.length - 1;
while (lo <= hi)
{ // 被查找的键要么不存在,要么必然存在于a[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 rank(int key, int[] a)
{
for (int i = 0; i < a.length; i++)
if (a[i] ==key) return i;
return -1;
}
如上,计算机用rank()方法的暴力实现处理大量输入非常慢。没有如二分查找或者归并排序这样的高效算法,解决大规模的白名单问题是不可能的。
以上是关于《算法》学习之二分查找的主要内容,如果未能解决你的问题,请参考以下文章