1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》
文章目录
- 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算法第四版》相关推荐
- 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。
十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...
- 前端开始学java_[Java教程]开启前端学习之路
[Java教程]开启前端学习之路 0 2014-06-10 17:00:06 前言 第一次在博客园写博客,写写自己开启前端学习之路.应该是受邢师兄的影响吧,不得不说邢师兄人很好,学习也很认真,师兄的前 ...
- 模运算——开启密码学学习之路
模运算--开启密码学学习之路 综述:学完高数,线性代数,概率论,数学已经学了一大半,本以为数学的知识也就到此结束,但没有想到这只是自己自欺欺人.开始看导师密码学的论文的时候,第一眼就吓傻眼,模运算mo ...
- 无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)
文章目录 1 无序链表的顺序查找 1.1 无序链表实现 1.2 分析 2 有序数组中的二分查找 2.1 实现 2.2 分析 3 对二分查找的分析 4 总结 5 后记 1 无序链表的顺序查找 1.1 无 ...
- 开启Python学习之路 必知必会的知识!
文章目录 一.认识Python 1. python3简介 2. python语言的特点 3. Python应用方向 二.开发环境搭建 1. Anaconda介绍 2. Pycharm介绍 3. 下载A ...
- 八、二分查找(Binary Search)
一.概述 二分查找(Binary Search,也称折半查找)--针对有序数据集合的查找算法 1.基本思想 类似分治思想,每次都通过跟区间的中间元素进行对比,将代查找的区间缩小为之前的一半,直到找到要 ...
- problem k: 查找某一个数_quot;细节魔鬼quot; 二分查找
❝ 二分查找,是一个高效,实用,且易理解的一个查找算法, 通常时间复杂度为O(lgn).局限性在于,待查找对象必须为有序的数组:数据量过小,优势不明显,数据量过大,数组大小受限于内存. 除此之外,二分 ...
- lintcode刷题 14. 二分查找,迭代和二分法Python实现
14. 二分查找 描述 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. ...
- C++二分查找,时间复杂度是O(logn)
二分查找属于一种简单却高效的算法,时间复杂度是O(logn),在二分查找之前需要先对其进行排序,C++里面的默认是升序,如果需要降序,需要进行一下修改: //C++排序是升序还是降序 //a>b ...
最新文章
- 马年计划2014-2-21
- 05-04-查看补丁更新报告
- WINDOWS XP 开始→运行→命令 集锦
- php采用fpdf生成中文pdf
- linux 系统中用root切换到普通用户时显示的异常如-bash-4.1$
- Oracle 12C 多种方式创建PDB
- 玩转CSS选择器(一) 之 使用方法介绍
- 顺序查找(Sequential Search)
- 我用Python帮学校写了一款图书管理系统!教导员居然请我吃饭
- cpu使用率_单片机里面的CPU使用率是什么鬼?
- 证明神经网络的通用逼近定理_在您理解通用逼近定理之前,您不会理解神经网络。...
- Java调用第三方平台发送手机短信
- 计算机推免经验分享——中科院信工所
- wow插件补充说明篇
- Pyinstaller:moviepy打包报错AttributeError: module ‘moviepy.audio.fx.all‘ has no attribute ‘audio_fadein‘
- 计算机维修情况说明书,电脑坏了(电脑坏了情况说明)
- 新手上路注意事项及驾车技巧
- MAC微信接收到的文档打开都变成(只读)解决办法
- MySQL删除表的三种方式
- Redisson分布式锁的配置和使用
热门文章
- del rd命令行下删除文件不需要确认
- Java中的queue和deque
- 学习JS的正则表达式
- 「Android」 详细全面的基于vue2.0Weex接入过程(Android视角)
- explicit_defaults_for_timestamp参数的专题报告
- [Linux] 使用openssl实现RSA非对称加密
- js中,(function(){})()的用法解析
- java interface 不能存常量数组?
- c语言二进制long,C语言填空题 把从键盘上输入的十进制数(long型)以二进制~十六进制任一制式的形式输出#include main(){...
- 解决go项目报错:fatal: could not read Username for ‘https://gitee.com‘: terminal prompts disabled