文章目录

  • 0.前言
  • 1.功能
  • 2.示例
    • 有两个名单tinyW.txt和tinyT.txt,将tinyT.txt名单中不在tinyW.txt的数据打印出来
      • ① 实现原理
      • ② 实现代码
      • ③ 性能分析

0.前言

  • 最近才开始学算法,学习的材料是《算法 第四版》java语言描述,我会在接下来的学习中运用以下步骤学习记录,望广大读者朋友能够喜欢,也请多多提提意见。
  • 首先我会说明这个算法提供了什么功能,拿来干嘛的,然后我会列几个例子来加深对这种算法的理解和应用,每个例子我都会进行实现原理的描述,有图有真相,还有它的代码,代码也会有注释分析,最后性能分析
  • 最近才刚学,所以后期我还会写性能分析,实际应用等,将书中的精华都总结下来,同时后期我也会刷题leetcode,将刷到的题目分类,会重新加入到各篇文章的例子中,初步估计会是以链接的方式载入。

1.功能

  • 其实功能不必说什么,名字已经能说明一切,就是查找功能,从海量的数据中查找你想要的数据。

2.示例

有两个名单tinyW.txt和tinyT.txt,将tinyT.txt名单中不在tinyW.txt的数据打印出来

① 实现原理

  • 算法是由静态方法rank()实现的,它接受一个整数键key和一个已经有序的int数组作为参数。 如果该键存在于数组中则返回它的索引,否则返回-1。
  • 算法使用两个变量1o和hi,并保证如果键在数组中则它一定在a[lo…hi]中,然后方法进入一个循环,不断将数组的中间键(索引为mid)和被查找的键比较。
  • 如果被查找的键等于a[mid],返回mid;否则算法就将查找范围缩小一半,如果被查找的键小于a[mid]就继续在左半边查找,如果被查找的键大于a[mid]就继续在右半边查找。算法找到被查找的键或是查找范围为空时该过程结束。
  • 实现图解:

② 实现代码

package Chapter1.Section11.cs1110;import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;import java.util.Arrays;public class BinarySearch {/*** This class should not be instantiated.*/private BinarySearch() {}// 查询key是否在数组a中,在就返回mid索引,不在就返回-1.public static int indexOf(int[] a, int key) {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 int rank(int key, int[] a) {return indexOf(a, key);}public static void main(String[] args) {// 从文件中读取数据In in = new In(args[0]);//这里有几个打印语句,我就是好奇想知道它存的是啥System.out.println("in:" + in.toString());System.out.println("in对象的内容:" + Arrays.toString(args));int[] whitelist = in.readAllInts();System.out.println("whitelist:" + whitelist.toString());System.out.println("whitelist数组未排序:" + Arrays.toString(whitelist));//排序数组Arrays.sort(whitelist);System.out.println("whitelist数组已排序:" + Arrays.toString(whitelist));// read integer key from standard input; print if not in whitelistwhile (!StdIn.isEmpty()) {int key = StdIn.readInt();//这里只是想看一下key是什么。标准输入的数据是啥System.out.print(key + ",");if (rank(key, whitelist) == -1)//这里我改了一下,*x*即为tinyT.txt中不再tinyW.txt中的数据StdOut.print("*" + key + "*,");}}
}

③ 性能分析

  • 二分查找快是因为它只需检查很少几个条目(相对于数组的大小)就能够找到目标元素( 或者确认目标元素不存在)。
  • 这里先简单描述一下,性能分析还没学,后期补充进来

参考:《java算法第四版》

1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》相关推荐

  1. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  2. 前端开始学java_[Java教程]开启前端学习之路

    [Java教程]开启前端学习之路 0 2014-06-10 17:00:06 前言 第一次在博客园写博客,写写自己开启前端学习之路.应该是受邢师兄的影响吧,不得不说邢师兄人很好,学习也很认真,师兄的前 ...

  3. 模运算——开启密码学学习之路

    模运算--开启密码学学习之路 综述:学完高数,线性代数,概率论,数学已经学了一大半,本以为数学的知识也就到此结束,但没有想到这只是自己自欺欺人.开始看导师密码学的论文的时候,第一眼就吓傻眼,模运算mo ...

  4. 无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)

    文章目录 1 无序链表的顺序查找 1.1 无序链表实现 1.2 分析 2 有序数组中的二分查找 2.1 实现 2.2 分析 3 对二分查找的分析 4 总结 5 后记 1 无序链表的顺序查找 1.1 无 ...

  5. 开启Python学习之路 必知必会的知识!

    文章目录 一.认识Python 1. python3简介 2. python语言的特点 3. Python应用方向 二.开发环境搭建 1. Anaconda介绍 2. Pycharm介绍 3. 下载A ...

  6. 八、二分查找(Binary Search)

    一.概述 二分查找(Binary Search,也称折半查找)--针对有序数据集合的查找算法 1.基本思想 类似分治思想,每次都通过跟区间的中间元素进行对比,将代查找的区间缩小为之前的一半,直到找到要 ...

  7. problem k: 查找某一个数_quot;细节魔鬼quot; 二分查找

    ❝ 二分查找,是一个高效,实用,且易理解的一个查找算法, 通常时间复杂度为O(lgn).局限性在于,待查找对象必须为有序的数组:数据量过小,优势不明显,数据量过大,数组大小受限于内存. 除此之外,二分 ...

  8. lintcode刷题 14. 二分查找,迭代和二分法Python实现

    14. 二分查找 描述 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. ...

  9. C++二分查找,时间复杂度是O(logn)

    二分查找属于一种简单却高效的算法,时间复杂度是O(logn),在二分查找之前需要先对其进行排序,C++里面的默认是升序,如果需要降序,需要进行一下修改: //C++排序是升序还是降序 //a>b ...

最新文章

  1. 马年计划2014-2-21
  2. 05-04-查看补丁更新报告
  3. WINDOWS XP 开始→运行→命令 集锦
  4. php采用fpdf生成中文pdf
  5. linux 系统中用root切换到普通用户时显示的异常如-bash-4.1$
  6. Oracle 12C 多种方式创建PDB
  7. 玩转CSS选择器(一) 之 使用方法介绍
  8. 顺序查找(Sequential Search)
  9. 我用Python帮学校写了一款图书管理系统!教导员居然请我吃饭
  10. cpu使用率_单片机里面的CPU使用率是什么鬼?
  11. 证明神经网络的通用逼近定理_在您理解通用逼近定理之前,您不会理解神经网络。...
  12. Java调用第三方平台发送手机短信
  13. 计算机推免经验分享——中科院信工所
  14. wow插件补充说明篇
  15. Pyinstaller:moviepy打包报错AttributeError: module ‘moviepy.audio.fx.all‘ has no attribute ‘audio_fadein‘
  16. 计算机维修情况说明书,电脑坏了(电脑坏了情况说明)
  17. 新手上路注意事项及驾车技巧
  18. MAC微信接收到的文档打开都变成(只读)解决办法
  19. MySQL删除表的三种方式
  20. Redisson分布式锁的配置和使用

热门文章

  1. del rd命令行下删除文件不需要确认
  2. Java中的queue和deque
  3. 学习JS的正则表达式
  4. 「Android」 详细全面的基于vue2.0Weex接入过程(Android视角)
  5. explicit_defaults_for_timestamp参数的专题报告
  6. [Linux] 使用openssl实现RSA非对称加密
  7. js中,(function(){})()的用法解析
  8. java interface 不能存常量数组?
  9. c语言二进制long,C语言填空题 把从键盘上输入的十进制数(long型)以二进制~十六进制任一制式的形式输出#include main(){...
  10. 解决go项目报错:fatal: could not read Username for ‘https://gitee.com‘: terminal prompts disabled