javascript数据结构与算法之检索算法


Posted in Javascript onApril 04, 2015

查找数据有2种方式,顺序查找和二分查找。顺序查找适用于元素随机排列的列表。二分查找适用于元素已排序的列表。二分查找效率更高,但是必须是已经排好序的列表元素集合。

一:顺序查找
顺序查找是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,或者直到列表的结尾都没有找到想要找的元素。

代码如下:

function seqSearch(data,arr) {
  for(var i = 0; i < arr.length; ++i) {
    if(arr[i] == data) {
      return true;
    }
  }
  return false;
}

我们也可以返回匹配元素位置的顺序查找函数,代码如下:

function seqSearch(data,arr) {
  for(var i = 0; i < arr.length; ++i) {
    if(arr[i] == data) {
      return i;
    }
  }
  return -1;
}

二:查找最小值和最大值

在数组中查找最小值算法如下:

   1. 将数组第一个元素赋值给一个变量,把这个变量作为最小值。
   2. 开始遍历数组,从第二个元素依次同当前最小值进行比较。
   3. 如果当前元素的数值小于当前最小值,则将当前元素设为新的最小值。
   4. 移动到下一个元素,重复步骤3.
   5.  当程序结束时,这个变量中存储的就是最小值。

代码如下:

function findMin(arr) {
  var min = arr[0];
  for(var i = 1; i < arr.length; ++i) {
    if(arr[i] < min) {
      min = arr[i];
    }
  }
  return min;
}

查找最大值算法和上面最小值类似,先将数组中第一个元素设为最大值,然后循环对数组剩余的每个元素与当前最大值进行比较,如果当前元素的值大于当前的最大值,则将该元素的值赋值给最大值。代码如下:

function findMax(arr) {
  var max = arr[0];
  for(var i = 1; i < arr.length; ++i) {
    if(arr[i] > max) {
      max = arr[i];
    }
  }
  return max;
 }

三:二分查找法。

 如果你要查找的数据是有序的,二分查找算法比顺序查找算法效率更高。二分查找算法基本原理如下:

 1. 将数组的第一个位置设置为下边界(0).
 2. 将数组的最后一个元素所在的位置设置为上边界(数组的长度减1)。
 3. 若下边界等于或小于上边界,则做如下操作:
    A. 将中点设置为(上边界加上下边界) 除以2.
    B. 如果中点的元素小于查询的值,则将下边界设置为中点元素所在下标加1.
    C. 如果中点的元素大于查询的值,则将上边界设置为中点元素所在下标减1.
    D. 否则中点元素即为要查找 的数据,可以进行返回。

代码如下:

// 二分查找算法
function binSearch(data,arr) {
var lowerBound = 0;
  var upperBound = arr.length - 1;
  while(lowerBound <= upperBound) {
    var mid = Math.floor((upperBound + lowerBound)/2);
    if(arr[mid] < data) {
      lowerBound = mid + 1;
    }else if(arr[mid] > data) {
      upperBound = mid - 1;
    }else {
      return mid;
    }
  }
  return -1;
}
 // 快速排序
function qSort(list) {
  if(list.length == 0) {
    return [];
  }
  // 存储小于基准值的值
  var left = [];
  // 存储大于基准值的值
  var right = [];
  var pivot = list[0];
  for(var i = 1; i < list.length; i++) {
    if(list[i] < pivot) {
      left.push(list[i]);
    }else {
      right.push(list[i])
    }
  }
  return qSort(left).concat(pivot,qSort(right));
}
 // 测试代码
var numbers = [0,9,1,8,7,6,2,3,5,4];
var list = qSort(numbers);
console.log(binSearch(6,list));

四:计算重复次数;
当二分查找算法binSearch()函数找到某个值时,如果在数据集中还有其他相同的值出现,那么该函数会定位在类似值附近,换句话说,其他相同的值可能会出现已找到值的左边或者右边。

那么我们最简单的方案是写2个循环,一个同时对数据集向下遍历或者向左遍历,统计重复次数;然后,向上或向右遍历,统计重复次数。代码如下:

// 计算重复次数
function count(data,arr) {
  var count = 0;
  var arrs = [];
  var position = binSearch(data,arr);
  if(position > -1) {
    ++count;
    arrs.push({"index":count});
    for(var i = position -1; i > 0; --i) {
      if(arr[i] == data) {
        ++count;
        arrs.push({"index":count});
      }else {
        break;
      }
    }
    for(var i = position + 1; i < arr.length; ++i) {
      if(arr[i] == data) {
        ++count;
        arrs.push({"index":count});
      }else {
        break;
      }
    }
  }
  return arrs;
}
 // 测试重复次数的代码
var arr = [0,1,1,1,2,3,4,5,6,7,8,9];
var arrs = count(1,arr);
console.log(arrs);
console.log(arrs.length);

如下图所示:

javascript数据结构与算法之检索算法

Javascript 相关文章推荐
比Jquery的document.ready更快的方法
Apr 28 Javascript
基于jQuery实现图片的前进与后退功能
Apr 24 Javascript
JS中把字符转成ASCII值的函数示例代码
Nov 21 Javascript
基于JavaScript实现div层跟随滚动条滑动
Jan 12 Javascript
jQuery电话号码验证实例
Jan 05 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
Feb 20 Javascript
jQuery动态移除和添加背景图片的方法详解
Mar 07 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
Mar 29 Javascript
基于jquery日历价格、库存等设置插件
Jul 05 jQuery
node.js实现的装饰者模式示例
Sep 06 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
Dec 28 Javascript
vue实现a标签点击高亮方法
Mar 17 Javascript
使用jquery制作弹出框效果
Apr 03 #Javascript
javascript 实现map集合
Apr 03 #Javascript
jQuery制作简洁的图片轮播效果
Apr 03 #Javascript
jQuery制作效果超棒的手风琴折叠菜单
Apr 03 #Javascript
jQuery实现左右切换焦点图
Apr 03 #Javascript
基于jquery ui的alert,confirm方案(支持换肤)
Apr 03 #Javascript
javascript制作sql转换为stringBuffer的小工具
Apr 03 #Javascript
You might like
乱谈我对耳机、音箱的感受
2021/03/02 无线电
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
用javascript操作xml
2006/11/04 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
JavaScript引用类型Array实例分析
2018/07/24 Javascript
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
在Python中使用defaultdict初始化字典以及应用方法
2018/10/31 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
python日志logging模块使用方法分析
2019/05/23 Python
Python PIL库图片灰化处理
2020/04/07 Python
解决jupyter notebook import error但是命令提示符import正常的问题
2020/04/15 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
旅游业大学生创业计划书
2014/01/31 职场文书
工作迟到检讨书
2014/02/21 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
银行授权委托书样本
2014/10/13 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
Python实现socket库网络通信套接字
2021/06/04 Python
MySQL 字符集 character
2022/05/04 MySQL