第 41 天: 顺序查找与折半查找

顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位。这个原理很简单,也算是最最基础的最容易想到的一种查找方式了。顺序查找使用岗哨可以节约一半的时间。 为此, 第 0 个位置不可以放有意义的数据, 即有效数据只有 length - 1 个。

/*** An inner class for data nodes. The text book usually use an int value to* represent the data. I would like to use a key-value pair instead.*/class DataNode {/*** The key.*/int key;/*** The data content.*/String content;/************************ The first constructor.**********************/DataNode(int paraKey, String paraContent) {key = paraKey;content = paraContent;}// Of the second constructor/************************ Overrides the method claimed in Object, the superclass of any class.**********************/public String toString() {return "(" + key + ", " + content + ") ";}// Of toString}// Of class DataNode/*** The data array.*/DataNode[] data;/*** The length of the data array.*/int length;/************************ The first constructor.* * @param paraKeyArray     The array of the keys.* @param paraContentArray The array of contents.**********************/public DataArray(int[] paraKeyArray, String[] paraContentArray) {length = paraKeyArray.length;data = new DataNode[length];for (int i = 0; i < length; i++) {data[i] = new DataNode(paraKeyArray[i], paraContentArray[i]);} // Of for i}// Of the first constructor/************************ Overrides the method claimed in Object, the superclass of any class.**********************/public String toString() {String resultString = "I am a data array with " + length + " items.\r\n";for (int i = 0; i < length; i++) {resultString += data[i] + " ";} // Of for ireturn resultString;}// Of toString/************************ Sequential search. Attention: It is assume that the index 0 is NOT used.* * @param paraKey The given key.* @return The content of the key.**********************/public String sequentialSearch(int paraKey) {data[0].key = paraKey;int i;// Note that we do not judge i >= 0 since data[0].key = paraKey.// In this way the runtime is saved about 1/2.// This for statement is equivalent to //for (i = length - 1; data[i].key != paraKey; i--);for (i = length-1; data[i].key != paraKey; i--) {;}//Of for ireturn data[i].content;}// Of sequentialSearch/************************ Test the method.**********************/public static void sequentialSearchTest() {int[] tempUnsortedKeys = { -1, 5, 3, 6, 10, 7, 1, 9 };String[] tempContents = { "null", "if", "then", "else", "switch", "case", "for", "while" };DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents);System.out.println(tempDataArray);System.out.println("Search result of 10 is: " + tempDataArray.sequentialSearch(10));System.out.println("Search result of 5 is: " + tempDataArray.sequentialSearch(5));System.out.println("Search result of 4 is: " + tempDataArray.sequentialSearch(4));}// Of sequentialSearchTest

这个的话就相当于传入数组的第一个位置没有实际含义,因为不管它的key值为-1,或者为数组中不一样的值,只要选择查找的值不为后面七个数值的任何一个,都会输出所对应的Content即是null,如果和数组中其他的值一样,也不影响,就会输出数组下表更大的值所对于的Content。另外像这样

public String sequentialSearch(int paraKey) {data[length-1].key = paraKey;int i;// Note that we do not judge i >= 0 since data[0].key = paraKey.// In this way the runtime is saved about 1/2.// This for statement is equivalent to //for (i = length - 1; data[i].key != paraKey; i--);for (i = 0; data[i].key != paraKey; i++) {;}//Of for ireturn data[i].content;}// Of sequentialSearch

把最后一个元素作为哨岗改为从前往后感觉更符合自己习惯,毕竟是i++形式(没有改注释,只改了代码,运行没问题)。

二分查找又称折半查找,它是一种效率较高的查找方法。

折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。 折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。但是,折半查找的先决条件是查找表中的数据元素必须有序。

折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

二分算法步骤描述

① 首先确定整个查找区间的中间位置 mid = ( left + right )/ 2

② 用待查关键字值与中间位置的关键字值进行比较;

若相等,则查找成功

若大于,则在后(右)半个区域继续进行折半查找

若小于,则在前(左)半个区域继续进行折半查找

③ 对确定的缩小区域再按折半公式,重复上述步骤。

/************************ Binary search. Attention: It is assume that keys are sorted in ascending* order.* * @param paraKey The given key.* @return The content of the key.**********************/public String binarySearch(int paraKey) {int tempLeft = 0;int tempRight = length - 1;int tempMiddle ;while (tempLeft <= tempRight) {tempMiddle = (tempLeft + tempRight) / 2;if (data[tempMiddle].key == paraKey) {return data[tempMiddle].content;} else if (data[tempMiddle].key <= paraKey) {tempLeft = tempMiddle + 1;} else {tempRight = tempMiddle - 1;}} // Of while// Not found.return "null";}// Of binarySearch

最大的感觉就是今天的比图轻松多了~

日撸 Java 三百行学习笔记day41相关推荐

  1. 日撸 Java 三百行(20 天: 过去10日总结)

    注意:这里是JAVA自学与了解的同步笔记与记录,如有问题欢迎指正说明 目录 · 前言 一.面向对象与面向过程相比, 有哪些优势? 二.比较顺序表和链表的异同 三.分析顺序表和链表的优缺点 四.分析调拭 ...

  2. 日撸 Java 三百行(特殊训练:关键路径)

    日撸 Java 三百行(特殊训练:关键路径) 注意:这里是JAVA自学与了解的同步笔记与记录,如有问题欢迎指正说明 日撸 Java 三百行(特殊训练:关键路径) 前言 一.关于AOE网 (Activi ...

  3. 日撸java三百行day63-65

    文章目录 说明 1. Day63-65 AdaBoosting算法 1 AdaBoostin举例 1.1数据样本 1.2 举例过程 2. 理论知识 3. 总结 2. 代码理解 1. WeightedI ...

  4. 日撸 Java 三百行day51-53

    文章目录 说明 Day51-52 KNN 分类器 1.KNN 2.代码 1.aff内容解读 2.代码理解 Day53 knn补充 1.加权思路 2.加权代码 3.leave-one-out 测试思路 ...

  5. 日撸 Java 三百行: DAY1 AND DAY2

    0.前言 由闵帆老师发布的教程:日撸 Java 三百行,有助于培养基本的java程序设计能力与良好的代码规范,同时逐渐深入,能够有助于对数据结构.机器学习相关知识的掌握与理解.我从今日开始,跟随此教程 ...

  6. 心得体会day52(日撸 Java 三百行)

    文章链接:日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客 day52 kNN 分类器 (续) 52.1 重新实现 computeNearests, 仅需要扫描一遍训练集, 即可 ...

  7. 日撸java三百行day61-62

    文章目录 说明 Day61 决策树 1.什么是决策树 2.什么是熵 3.什么是信息增益 4.详细例子 1. weather样本 2.第一次决策 3.第二次决策 4.最终决策树 4. 代码理解 4.1 ...

  8. 日撸java三百行day58-59

    文章目录 说明 Day58 符号型数据的 NB 算法 1.基础理论知识 1.1 条件概率 1.2 独立性假设 1.3 Laplacian 平滑 2. 符号型数据的预测算法跟踪 2.1 testNomi ...

  9. 日撸 Java 三百行(51-60天,kNN 与 NB)

    目录 总述 01-10天,基本语法 11-20天,线性数据结构 21-30天,树与二叉树 31-40天,图 41-50天,查找与排序 51-60天,kNN 与 NB 61-70天,决策树与集成学习 7 ...

最新文章

  1. 单片机开发工程师需要学哪些,单片机工作的基本条件
  2. 纳米计算机存储量,纳米计算-人们需要知道的一切!
  3. 前端学习(2782):获取轮播图的数据
  4. vue 项目:文件夹 结构 、配置详解
  5. python excel导入oracle数据库_【Python代替Excel】12:Python操作oracle数据库
  6. 深度学习(七十三)pytorch学习笔记
  7. 一个计算两个日期间隔的算法
  8. html5声明utf-8,HTML5中的SVG – 什么时候是XML声明`?xml version =“1.0”encoding =“UTF-8”?`需要吗?...
  9. PostgreSQL修改pgsql提示符
  10. 从零玩转Webpack4~5+实现原理笔记(二)
  11. 3U VPX板卡设计
  12. Fail to convert to internal representation
  13. 形态学空间格局分析(MSPA)—ArcGIS结合Guidos软件
  14. 批量修改后缀名的方法
  15. 没想到!2018微信年度数据报告显示使用最多的表情竟是...
  16. vs2017无法打开文件atls.lib问题
  17. matlab app designer学习笔记1——简易计算器
  18. Awesome Adb——一份超全超详细的 ADB 用法大全【转】
  19. python音乐播放器
  20. 新松机器人产业小镇_总投资35亿元!新松机器人产业园及创新公共服务平台项目落户永修组团...

热门文章

  1. 常见问题:企业微信机器人账号消息如何对应
  2. 要拥有必先懂失去怎接受——退役了~
  3. 推荐一个好玩的小游戏网站
  4. 码绘与手绘的比较【动态篇】
  5. 概率论笔记 by 知乎 sola
  6. 飞机大战游戏开发记录(Java)
  7. 基于H5+的方法实现APP手机文件夹得存储
  8. java网络编程(下)
  9. 联想 笔记本 改WIN7 BIOS 设置详解
  10. 数字图像处理(第二版)许录平习题答案