Algs4-1.1.38二分查找与暴力查找

1.1.38二分查找与暴力查找。根据1.1.10.4节给出的暴力查找法编写一个程序BruteForceSearch,在你的计算机上比较它和BinarySearch处理largeW.txt和largeT.txt所需的时间。
解:
暴力查找约用时:2371秒
二分查找约用时: 17秒

//暴力查找代码
import java.util.Date;
public class BruteForceSearch
{
    public static int rank(int key,int[] a)
    {
       for (int i=0;i<a.length;i++)
           if (a[i]==key) return i;
       return -1;
    }//end rank 
 
    public static void main(String[] args)
    {
        int[] whitelist=In.readInts(args[0]);
        int postion;
        Date timeStart=new Date();
        while (!StdIn.isEmpty())
        {
            int key=StdIn.readInt();
            postion=rank(key,whitelist);
        }  
        Date timeEnd=new Date();
        StdOut.printf("BruteForceSearch used time:");
        StdOut.println(timeEnd.getTime()-timeStart.getTime());
    }
}

//二分查找代码
import java.util.Date;
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)
        {
            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]);
        int postion;
        Date timeStart=new Date();
        Arrays.sort(whitelist);
        while (!StdIn.isEmpty())
        {
            int key=StdIn.readInt();
            postion= rank(key,whitelist);
        }
        Date timeEnd=new Date();
        StdOut.printf("BinarySearch used time:");
        StdOut.println(timeEnd.getTime()-timeStart.getTime());
    }
}

原文地址:https://www.cnblogs.com/longjin2018/p/9848760.html

时间: 2024-10-10 00:09:49

Algs4-1.1.38二分查找与暴力查找的相关文章

【算法】二分查找与暴力查找(白名单过滤)

二分查找与暴力查找. 如果可能,我们的测试用例都会通过模拟实际情况来展示当前算法的必要性.这里该过程被称为白名单过滤.具体来说,可以想象一家信用卡公司,它需要检查客户的交易账号是否有效.为此,它需要: 将客户的账号保存在一个文件中,我们称它为白名单: 从标准输入中得到每笔交易的账号: 使用这个测试用例在标准输出中打印所有与任何客户无关的账号,公司很可能拒绝此类交易. 在一家有上百万客户的大公司中,需要处理数百万甚至更多的交易都是很正常的.为了模拟这种情况,我们提供了文件largeW.txt(10

二分查找(折半查找)

二分查找条件:有序数组. 查找原理:查找过程从数组的中间元素开始,如果中间元素正好等于要查找的元素,则搜索过程结束: 如果某一特定元素大于或小于中间元素,则在数组大于或小于中间原色的那一半中查找,而且跟开始一样从中间元素开始比较. 如果在某一步骤数组为空,则代表找不到. 这种搜索算法每一次比较都使搜索范围缩小一半. 时间复杂度:O(logn) 使用二分查找有两个前提条件: 1,待查找的列表必须有序. 2,必须使用线性表的顺序存储结构来存储数据. 下面是实现代码. C#版: namespace B

二分查找 (折半查找)

二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构          2.必须按关键字大小有序排列. [优缺点]折半查找法的优点是比较次数少,查找速度快,平均性能好;             其缺点是要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于 不经常变动而 查找频繁的有序列表. [算法思想]首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:                              否则利用中

Java中常用的查找算法——顺序查找和二分查找

Java中常用的查找算法——顺序查找和二分查找 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位. b) 图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8 代码演示: import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch { public static void main(String[] arg

【1】二分查找(折半查找)

二分查找又称折半查找,它是一种效率较高的查找方法.  [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. /** * 二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. * * @author Administrator * */ public static void main(String[] args) { int[] src = new int[] { 1, 3, 5, 7, 8, 9 };

查找算法:二分查找、顺序查找

08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205 查找算法 查找算法是在存在的序列(list) 中查找特定的目标(target),要求序列中每个记录必须与一个关键词(key)关联才能进行查找. 查找算法通常需要两个输入: 1.被查找的序列 2.要查找的关键词 查找算法的输出参数和返回值: 1.返回类型为 Error_co

查找算法系列之简单查找:顺序查找、二分查找、分块查找

近期总结了各大排序算法的原理 ,并对其进行了实现,想着一并把查找算法总结了,今天就着手开始总结查找算法. 废话不多说,这篇文章从最简单的查找算法开始讲起,之后会补充复杂的二叉搜索树查找(BST)和B树,B+树查找以及哈希查找等. 顾名思义,查找就是寻找到关键字在队列中的位置,最笨的查找算法就是依次顺序比较,复杂度为O(n),但是有很多方法的复杂度可以达到O(logn)等等. 1.顺序查找 关键字与数组中的数顺序比较,时间复杂度O(n). template<class T> int OrderS

看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)

查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 静态查找表:只查找,而不进行插入,删除. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素. 静态表的 查找 大致 四种 算法: 线性查找,二分查找,斐波那契查找和插值查找. 其中 在线性查找之前,对表 无要求.对于 其余三种 需要 在查找之前 排序.插值查找 除了 需要 排序,还需要 均匀分布. 下面 给出代码: 线性查

二分查找(折半查找)C++

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少: 其缺点是要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功: 否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表. 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查