JS数组搜索之折半搜索实现方法分析


Posted in Javascript onMarch 27, 2017

本文实例讲述了JS数组搜索之折半搜索实现方法。分享给大家供大家参考,具体如下:

一. 方法原理:

当从一个给定的序列数组arr中, 查找某个特定值value时, 折半搜索法是这样做的:

1. 确定搜索范围的起始点: 起点startIndex = 0, 终点endIndex = arr.length - 1;

2. 根据起始点来确定一个中间点middle = Math.floor((终点 - 起点) / 2);

3. 在startIndex < endIndex的前提下, 比较arr[middle]与value的大小:

(1) arr[middle] < value

调整搜索范围为数组的后半部分, 即startIndex = middle + 1, endIndex = arr.length -1;

(2) arr[middle] > value

调整搜索范围为数组的前半部分, 即startIndex = 0, endIndex = middle - 1;

接着, 重新计算middle, 再比较arr[middle]与value, 直到两者相等或者startIndex >= endIndex.

二. 代码:

// 该例的写法适用于序列为由小到大的数组
function binarySearch(arr, value) {
  var startIndex = 0,
  endIndex = arr.length - 1;
  middle = Math.floor((endIndex - startIndex) / 2);
  while (arr[middle] !== value && startIndex < endIndex) {
    if (arr[middle] > value) {
      endIndex = middle - 1;
    } else if (arr[middle] < value) {
      startIndex = middle + 1;
    }
    middle = Math.floor((endIndex - startIndex) / 2);
  }
  return (arr[middle] !== value) ? -1 : middle;
}

三. 优缺点:

(1) 优点:

每查找一次, 被查找的数组项数量会减少一半, 因此其在性能上要优于线性搜索法(在数组项较多时, 尤其明显);

(2) 缺点:

只适用于序列数组, 在对普通数组使用该方法之前, 需要对数组进行排序

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery动态添加的元素绑定事件处理函数代码
Aug 02 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
Oct 29 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
Mar 17 Javascript
js 遍历json返回的map内容示例代码
Oct 29 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
Jun 24 Javascript
JavaScript调用客户端Java程序的方法
Jul 27 Javascript
js clearInterval()方法的定义和用法
Nov 11 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
Jun 02 Javascript
Vuex之理解Getters的用法实例
Apr 19 Javascript
webstorm中vue语法的支持详解
May 09 Javascript
js实现橱窗展示效果
Jan 11 Javascript
vue自定义组件实现双向绑定
Jan 13 Vue.js
javascript实现下雨效果
Mar 27 #Javascript
HTML的select控件美化
Mar 27 #Javascript
JS实现的点击表头排序功能示例
Mar 27 #Javascript
深入理解AngularJS中的ng-bind-html指令
Mar 27 #Javascript
vue2.0实战之基础入门(1)
Mar 27 #Javascript
jQuery中的deferred使用方法
Mar 27 #jQuery
Angular2利用组件与指令实现图片轮播组件
Mar 27 #Javascript
You might like
php db类库进行数据库操作
2009/03/19 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
php正则表达式学习笔记
2015/11/13 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
python实现保存网页到本地示例
2014/03/16 Python
python中的sort方法使用详解
2014/07/25 Python
Python计算程序运行时间的方法
2014/12/13 Python
python爬虫使用cookie登录详解
2017/12/27 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
Python数据正态性检验实现过程
2020/04/18 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
2021/02/01 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
轻化专业学生实习自我鉴定
2013/09/20 职场文书
网络工程专业毕业生推荐信
2013/10/28 职场文书
药学专业大学生个人的自我评价
2013/11/04 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis