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 相关文章推荐
range 标准化之获取
Aug 28 Javascript
JavaScript实现自己的DOM选择器原理及代码
Mar 04 Javascript
JavaScript将Table导出到Excel实现思路及代码
Mar 13 Javascript
javascript if条件判断方法小结
May 17 Javascript
JS获得图片alt信息的方法
Apr 01 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
Sep 27 Javascript
bootstrap组件之导航组件使用方法
Jan 19 Javascript
JavaScript基本语法_动力节点Java学院整理
Jun 26 Javascript
JS解析url查询参数的简单代码
Aug 06 Javascript
react-native 完整实现登录功能的示例代码
Sep 11 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
Dec 12 Javascript
vue导入.md文件的步骤(markdown转HTML)
Dec 31 Vue.js
使用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
MySQL中create table语句的基本语法是
2007/01/15 PHP
php文本转图片自动换行的方法
2013/03/13 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
2015/08/23 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
Python代码实现KNN算法
2017/12/20 Python
pycharm创建一个python包方法图解
2019/04/10 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
大学生水果店创业计划书
2014/01/28 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
青年文明号口号
2014/06/17 职场文书
单位工作证明书格式
2014/10/04 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
师德师风个人总结
2015/02/06 职场文书
董事长助理岗位职责
2015/02/11 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
MongoDB数据库之添删改查
2022/04/26 MongoDB
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android