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(二) 事件机制(1)
Nov 25 Javascript
JQuery实现鼠标移动到图片上显示边框效果
Jan 09 Javascript
JavaScript调用浏览器打印功能实例分析
Jul 17 Javascript
基于javascript html5实现3D翻书特效
Mar 14 Javascript
HTML Table 空白单元格补全的简单实现
Oct 13 Javascript
vue调用高德地图实例代码
Apr 28 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 jQuery
在一般处理程序(ashx)中弹出js提示语
Aug 16 Javascript
express + jwt + postMan验证实现持久化登录
Jun 05 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
Jun 24 Javascript
Layui动态生成select下拉选择框不显示的解决方法
Sep 24 Javascript
详解ES6中class的实现原理
Oct 03 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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
PHP的宝库目录--PEAR
2006/10/09 PHP
php在线生成ico文件的代码
2007/10/09 PHP
php的XML文件解释类应用实例
2014/09/22 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
JavaScript window.location对象
2014/11/14 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
思想专业自荐信范文
2013/12/25 职场文书
马智宇结婚主持词
2014/04/01 职场文书
数学系毕业生求职信
2014/05/29 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
思想政治表现评语
2015/01/04 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python